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

import java.util.Date;

import javax.inject.Inject;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.gebietsbaum.boundary.NlWasGebietEdit;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebietKorrekturenStimmeingabenStatus;
import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.LetzterEingangLoader;
import de.ivu.elect.business.stimmeingabe.boundary.NlErgebniseingangKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.LetzterEingang;
import de.ivu.elect.business.wahl.entity.NlWahlCustomData;
import de.ivu.elect.business.wahl.entity.NlWahlPhase;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;
import de.ivu.elect.presentation.stimmeingabe.menu.StimmeingabeErfassenMenuItemEntry;

public abstract class AbstractNlWasGebietKorrekturenStimmeingabenStatusAction extends AbstractGebietAction {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient StimmeingabeErfassenMenuItemEntry stimmeingabeErfassenMenuItemEntry;

  @Inject
  private transient UserLocale userLocale;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient NlWasGebietEdit nlWasGebietEdit;

  @Inject
  private transient LetzterEingangLoader letzterEingangLoader;

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect wahldurchfuehrungsgebietSessionSelect;

  protected AbstractNlWasGebietKorrekturenStimmeingabenStatusAction() {
    super();
  }

  @Override
  public boolean isDisabledInternal(Gebiet gebiet) {
    return super.isDisabledInternal(gebiet) || /* ELECT-15688 */ !getWahlPhase(gebiet).isErfassung() || !NlGebietKorrekturenStimmeingabenStatus.isRelevant(gebiet, getCustomer())
        || isDisabledInternal(new NlGebiet(gebiet).getKorrekturenStimmeingabenStatus());
  }

  private boolean isDisabledInternal(NlGebietKorrekturenStimmeingabenStatus korrekturenStimmeingabenStatus) {
    return korrekturenStimmeingabenStatus == null || !korrekturenStimmeingabenStatus.isUebergangZulaessig(getKorrekturenStimmeingabenStatus());
  }

  protected abstract NlGebietKorrekturenStimmeingabenStatus getKorrekturenStimmeingabenStatus();

  @Override
  protected UseCasePermission getRequiredPermission() {
    return UseCasePermission.CUSTOMER_5; // ELECT-15271
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return getBearbeitenGebietSecurity();
  }

  @Override
  protected String doIt(Gebiet gebiet) {
    return saveKorrekturenStimmeingabenStatus(gebiet);
  }

  @Override
  public String getLabelKey() {
    return "NlGebietKorrekturenStimmeingabenStatus." + getKorrekturenStimmeingabenStatus().name() + ".action.label";
  }

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

  public String getDialogMessage() {
    LetzterEingang letzterEingang = LetzterEingang.UNBEKANNT;

    Gebiet gebiet = gebietConversationSelect.getEntity();

    if (gebiet != null) {
      Wahl wahl = gebiet.getWahl();

      if (wahl != null) {
        letzterEingang = letzterEingangLoader.bestimmeLetztenEingang(wahl.getPk(), gebiet.getPk(), NlErgebniseingangKonfiguration.ERGEBNISEINGANGSART);
      }
    }

    String msgKey = "NlGebietKorrekturenStimmeingabenStatus." + getKorrekturenStimmeingabenStatus().name() + ".dialog.message";

    if (letzterEingang.isEingangVorhanden()) {
      String erfasstDurch = letzterEingang.getErfasser();
      Date erfasstAm = letzterEingang.getZeitstempel();

      return getMessage(msgKey + ".params", getMessage(letzterEingang.getErgebniseingabestufe()), erfasstDurch, userLocale.formatDate(erfasstAm), userLocale.formatTimeHHmm(erfasstAm));
    }

    return getMessage(msgKey);
  }

  public boolean isBtnSaveKorrekturenStimmeingabenStatusRendered() {
    return true;
  }

  public String getBtnSaveKorrekturenStimmeingabenStatusLabel() {
    return getMessage("NlGebietKorrekturenStimmeingabenStatus.dialog.action.save.korrekturen.stimmeingaben.status");
  }

  public void saveKorrekturenStimmeingabenStatus() {
    Gebiet gebiet = gebietConversationSelect.getEntity();

    String outcome = saveKorrekturenStimmeingabenStatus(gebiet);

    gebietConversationSelect.clearEntity();

    refreshViewOnNonBlankResult(gebiet, outcome);
  }

  private String saveKorrekturenStimmeingabenStatus(Gebiet gebiet) {
    if (gebiet != null) {
      nlWasGebietEdit.saveKorrekturenStimmeingabenStatus(gebiet, getKorrekturenStimmeingabenStatus());
    }

    return FacesContextUtil.getCurrentViewId();
  }

  public boolean isBtnOpenStimmeingabenErfassenRendered() {
    return true;
  }

  public String getBtnOpenStimmeingabenErfassenLabel() {
    return getMessage("NlGebietKorrekturenStimmeingabenStatus.dialog.action.open.stimmeingaben.erfassen");
  }

  @Redirect
  public String openStimmeingabenErfassen() {
    Gebiet gebiet = gebietConversationSelect.getEntity();

    if (gebiet != null) {
      wahldurchfuehrungsgebietSessionSelect.setEntity(gebiet);
    }

    return stimmeingabeErfassenMenuItemEntry.getTargetViewId();
  }

  @Override
  public String getIcon() {
    return appIcons.getIconEdit();
  }

  private Customer getCustomer() {
    return currentCustomer.getCustomer();
  }

  protected NlWahlPhase getWahlPhase(Gebiet gebiet) {
    if (gebiet == null) {
      return NlWahlPhase.NICHT_GESETZT;
    }

    Wahl wahl = gebiet.getWahl();

    if (wahl == null) {
      return NlWahlPhase.NICHT_GESETZT;
    }

    return wahl.getCustomData(NlWahlCustomData.class).getNlWahlPhase();
  }
}
