
package de.ivu.elect.presentation.wahlvorschlag.action;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturExtendedDAO;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahlrechtspruefung.entity.NlPruefkriteriumAuswirkung;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeConversationSelect;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.presentation.wahlvorschlag.NlListeActionHelper;

@Specializes
public class NlListeZulassungZuruecksetzenAction extends ListeZulassungZuruecksetzenAction {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient NlListeActionDisabled nlListeActionDisabled;

  @Inject
  private transient ListeConversationSelect listeConversationSelect;

  @Inject
  private transient NlListeActionHelper nlListeActionHelper;

  @Inject
  private transient ListenkandidaturExtendedDAO listenkandidaturExtendedDAO;

  public NlListeZulassungZuruecksetzenAction() {
    super();
  }

  @Override
  public boolean isDisabledInternal(@Nonnull Liste liste) {
    liste.setListenkandidaturenPreloader(listenkandidaturExtendedDAO);

    return super.isDisabledInternal(liste) || nlListeActionDisabled.isDisabled(liste) && !NlGebiet.isListenwahlgebietenUebergeordnetesGebiet(gebietSessionSelect.getEntity()); // ELECT-11361
  }

  @Override
  public String getDialogName() {
    return "NlListeZulassungZuruecksetzenConfirm";
  }

  public String getDialogHeader() {
    return getLocalizedLabel();
  }

  public String getDialogMessage() {
    return getMessage("liste.search.action.zuruecksetzen.confirm.message");
  }

  public void doActionConfirmedListe() {
    doActionConfirmed(NlPruefkriteriumAuswirkung.LISTE);
  }

  public boolean isConfirmRenderedListe() {
    return nlListeActionHelper.isButtonConfirmedWahlkreisRendered(getListe(), getSelectedGebiet());
  }

  public String getLabelConfirmedListe() {
    if (isWahlMitWahlkreisen()) {
      return getMessage("nl.liste.zuruecksetzen.wahlkreis");
    }

    return getMessage("nl.liste.zuruecksetzen.liste");
  }

  public void doActionConfirmedStel() {
    doActionConfirmed(NlPruefkriteriumAuswirkung.STEL);
  }

  public boolean isConfirmRenderedStel() {
    return nlListeActionHelper.isButtonConfirmedStelRendered(getListe(), getSelectedGebiet());
  }

  public String getLabelConfirmedStel() {
    return getMessage("nl.liste.zuruecksetzen.stel");
  }

  public void doActionConfirmedGruppe() {
    doActionConfirmed(NlPruefkriteriumAuswirkung.GRUPPE);
  }

  public boolean isConfirmRenderedGruppe() {
    return nlListeActionHelper.isButtonConfirmedGruppeRendered(getListe(), getSelectedGebiet());
  }

  public String getLabelConfirmedGruppe() {
    return getMessage("nl.liste.zuruecksetzen.gruppe");
  }

  private Liste getListe() {
    return listeConversationSelect.getEntity();
  }

  private void doActionConfirmed(NlPruefkriteriumAuswirkung nlPruefkriteriumAuswirkung) {
    Liste liste = listeConversationSelect.getEntity();
    liste.getTransientContext().put(NlPruefkriteriumAuswirkung.AUSWIRKUNG_CONTEXT_KEY, nlPruefkriteriumAuswirkung);

    String outcome = doActionConfirmed(liste);

    listeConversationSelect.clearEntity();

    refreshViewOnNonBlankResult(liste, outcome);
  }

  @Override
  @Nullable
  protected String doIt(Liste liste) {
    listeConversationSelect.setEntity(liste);

    return null; // dialog anzeigen
  }

  private String doActionConfirmed(Liste liste) {
    if (liste != null && isActionPossible(liste)) {
      super.doIt(liste); // super von doIt Verwenden
    }

    return FacesContextUtil.getCurrentViewId();
  }

  private boolean isWahlMitWahlkreisen() {
    Gebiet gebiet = getSelectedGebiet();

    if (gebiet != null) {
      return NlWahlart.valueOf(gebiet.getWahl()).isWahlartMitWahlkreisen();
    }

    return true; // Bisheriger Standard...
  }

  private Gebiet getSelectedGebiet() {
    return gebietSessionSelect.getEntity();
  }
}
