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

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.entity.NlWahlPhase;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.presentation.ergebnis.menu.NlWasErgebnisArtefaktNachGebietAbschlussBulkExportMenuItemEntry;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;

@Named(NlWasAbschlussWahlphaseSchrittMenuItem.COMPONENT_NAME)
public class NlWasAbschlussWahlphaseSchrittMenuItem extends AbstractNlWasWahlphaseSchrittMenuItem {
  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "nlWasAbschlussWahlphaseSchrittMenuItem";

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Inject
  private transient NlWasErgebnisArtefaktNachGebietAbschlussBulkExportMenuItemEntry nlWasErgebnisArtefaktNachGebietAbschlussBulkExportMenuItemEntry;

  @Override
  public String getLabelKey() {
    return "nl.wahlphase.schritt.abschluss";
  }

  @Override
  protected NlWahlPhase getZielWahlPhase() {
    return NlWahlPhase.ABSCHLUSS;
  }

  @Override
  public String doActionInternal() {
    boolean wasBefore = isBefore();
    String result = super.doActionInternal();

    if (!wasBefore) {
      if (nlWasErgebnisArtefaktNachGebietAbschlussBulkExportMenuItemEntry.isPossible()) {
        return nlWasErgebnisArtefaktNachGebietAbschlussBulkExportMenuItemEntry.getTargetViewId();
      }
    }

    return result;
  }

  @Override
  protected boolean isPhaseDarfAktivWerdenInternal() {
    if (NlWahlPhase.ERFASSUNG.equals(getAktuellePhase())) {

      Wahl selectedWahl = getSelectedWahl();
      if (selectedWahl == null) {
        return false;
      }
      Ergebniseingangsart ergebniseingangsart = selectedWahl.castTo(Wahldurchfuehrung.class).getEntity().getErgebniseingangsart();
      return wahldurchfuehrungsgebietExtendedDAO.findByWahl(selectedWahl).stream().noneMatch(
          wahldurchfuehrungsgebiet -> wahldurchfuehrungsgebiet.isErfassungsgebiet() && (wahldurchfuehrungsgebiet
              .getErgebniseingang(ergebniseingangsart) == null || !wahldurchfuehrungsgebiet
              .getErgebniseingang(ergebniseingangsart).isInErgebnisUebernehmbar()));

    }

    // im CSB gibt es eine Phase mehr...
    if (NlWahlPhase.SITZBERECHNUNG.isAccept(currentCustomer.getCustomer(), getSelectedWahl())) {
      return NlWahlPhase.SITZBERECHNUNG.equals(getAktuellePhase());
    }

    return true;
  }

  @Nullable
  @Override
  public String getDialogName() {
    if (isBefore()) {
      return "wahlabschluss-zurueck";
    }
    return "wahlabschluss";

  }

}
