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

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

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.stimmeingabe.boundary.LetzterEingangLoader;
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;

@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;

  @Inject
  private transient LetzterEingangLoader letzterEingangLoader;

  public NlWasAbschlussWahlphaseSchrittMenuItem() {
    super();
  }

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

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

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

    return "wahlabschluss";
  }

  @Override
  protected String getDialogHeaderMsgKey(Wahl wahl) {
    if (isBefore()) {
      return "wahl.prozess.wahlabschluss-zurueck.header";
    }

    return "wahl.prozess.wahlabschluss.header";
  }

  @Override
  protected String getDialogMessageMsgKey(Wahl wahl) {
    if (isBefore()) {
      return "wahl.prozess.wahlabschluss-zurueck.message";
    }

    return "wahl.prozess.wahlabschluss.message";
  }

  @Override
  protected String getDialogActionLabelMsgKey(Wahl wahl) {
    if (isBefore()) {
      return "wahl.prozess.wahlabschluss-zurueck.action";
    }

    return "wahl.prozess.wahlabschluss.action";
  }

  @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()
          && !letzterEingangLoader.bestimmeLetztenEingang(wahldurchfuehrungsgebiet.getWahl().getPk(), wahldurchfuehrungsgebiet.getPk(), ergebniseingangsart).isInErgebnisUebernehmbar());
    }

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

    return true;
  }

  @Override
  protected String doActionInternalAfterCheck() {
    boolean wasBefore = isBefore();
    String result = super.doActionInternalAfterCheck();

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

    return result;
  }
}
