
package de.ivu.elect.presentation.ergebnis.menu;

import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.boundary.NlErgebniseingabestatuswechelPruefer;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagExtendedDAO;
import de.ivu.elect.presentation.exchange.menu.AbstractExportMenuItemEntry;
import de.ivu.elect.presentation.wahl.exchange.AbstractNlExportArtefaktNachSystemExportstatusBulkExportDescription;


import static java.util.Arrays.asList;

public abstract class AbstractNlWasErgebnisArtefaktNachGebietErgebniseingabestatusBulkExportMenuItemEntry extends AbstractExportMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient NlErgebniseingabestatuswechelPruefer nlErgebniseingabestatuswechelPruefer;

  @Inject
  private transient WahlvorschlagExtendedDAO wahlvorschlagExtendedDAO;

  public AbstractNlWasErgebnisArtefaktNachGebietErgebniseingabestatusBulkExportMenuItemEntry() {
    super();
  }

  @Override
  protected abstract AbstractNlExportArtefaktNachSystemExportstatusBulkExportDescription getExportDescription();

  public boolean isExportMoeglichOnGebietErgebniseingabestatusChanged(Ergebniseingabestatus ergebniseingabestatusGesetzt) {
    if (isExportMoeglich(asList(ergebniseingabestatusGesetzt))) {
      // Export hängt vom aktuellen Ergebniseingabestatus des relevanten Gebietes ab, dessen Änderungen der (gecachte) SupportedFileFormatErmittler (aktuell) NICHT auswertet...
      supportedFileFormatErmittler.reset();

      return isRendered() && !isDisabled();
    }

    return false;
  }

  @Override
  protected boolean isDisabledInternal() {
    return super.isDisabledInternal() || !isExportMoeglich(getGebietErgebniseingabestatus()) || !isWahlvorschlaegeVorhanden()/*ELECTVAPP-583*/;
  }

  private boolean isWahlvorschlaegeVorhanden() {
    return getSelectedWahl() != null && wahlvorschlagExtendedDAO.findByCountWahlvorschlagByWahl(getSelectedWahl()) > 0;
  }

  private boolean isExportMoeglich(Collection<Ergebniseingabestatus> ergebniseingabestatus) {
    return getGebietErgebniseingabestatus().containsAll(ergebniseingabestatus)
        && nlErgebniseingabestatuswechelPruefer.isErgebnisExportMoeglich(ergebnisSessionSelect.getEntity(), ergebniseingabestatus);
  }

  protected abstract Collection<Ergebniseingabestatus> getGebietErgebniseingabestatus();

  @Override
  public String getLabel() {
    return getMessage(getLabelKey(), getMessage(getDateiExportName()));
  }

  @Override
  public String getLabelKey() {
    String msgKey = getDateiExportName() + ".export.label";

    if (getMessages().isMessageKeyVorhanden(msgKey)) {
      return msgKey;
    }

    return super.getLabelKey();
  }

  private String getDateiExportName() {
    return getExportDescription().getDateiExportName();
  }
}
