
package de.ivu.elect.presentation;

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.Date;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisberechnungHintergrund;
import de.ivu.elect.business.ergebnis.control.ErgebnisAuszaehlungsstandErmittler;
import de.ivu.elect.business.ergebnis.control.ZwischenergebnisberechnungBackgroundService;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ErgebnisberechnungStatus;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameterExtendedLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;

@Specializes
public class WasLayoutComponentsContext extends CoreLayoutComponentsContext {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect wahldurchfuehrungsgebietSessionSelect;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  @Inject
  private transient ErgebnisAuszaehlungsstandErmittler ergebnisAuszaehlungsstandErmittler;

  @Inject
  private transient ErgebnisberechnungHintergrund ergebnisberechnungHintergrund;

  @Inject
  private transient WahlParameterExtendedLoader wahlParameterExtendedLoader;

  public WasLayoutComponentsContext() {
    super();
  }

  @Override
  protected boolean isCustomerSubcontextPresent() {
    return isErgebnisSelected() && isGebietSelected();
  }

  @Override
  protected String buildSubcontextName() {
    if (isErgebnisSelected() && isGebietSelected()) {
      return buildSubcontextFuerErgebnis();
    }

    return super.buildSubcontextName();
  }

  protected String buildSubcontextFuerErgebnis() {
    StringBuilder result = new StringBuilder();

    Ergebnis ergebnis = getSelectedErgebnis();
    Wahldurchfuehrungsgebiet gebiet = getSelectedGebiet();

    String gebietNameFormatiert = gebietNummerFormatter.getDarstellung(gebiet);

    if (isNotBlank(gebietNameFormatiert)) {
      result.append(gebietNameFormatiert);
      appendErgebniseingabestatus(result, ergebnis, gebiet);
      result.append(" - ");
    }

    Wahl wahl = ergebnis.getWahl();

    if (ergebnisberechnungHintergrund.isAktiviert() && wahlParameterExtendedLoader.resolveEnumValue(wahl, WahlParameterWerte.ERGEBNISBERECHNUNG_STATUS, ErgebnisberechnungStatus.class).isAktiv()) {
      if (ergebniseingangKonfiguration.isWechselErgebniseingangsartenUnterstuetzt(wahl)) {
        result.append(getMessage(ergebnis.getErgebnisart()));
        result.append(" - ");
      }

      result.append(getMessage(ergebnis.getErgebnisStatus()));

      Date zeitstempel = ergebnis.getZeitstempel();

      if (zeitstempel != null) {
        result.append(" - ");
        result.append(formatDateTime(zeitstempel));
      }

      long anzahlGebieteAusgezaehlt;
      long anzahlErfassungsgebiete;

      String hinweisAusgezwehlt;

      if (!gebiet.hasUebergeordnetesGebiet() || gebiet.isErfassungsgebiet()) {
        anzahlGebieteAusgezaehlt = ergebnisAuszaehlungsstandErmittler.getAnzahlGueltigeErgebniseingaengeFuerErgebnisUndWurzelgebiet(ergebnis);
        anzahlErfassungsgebiete = ergebnisAuszaehlungsstandErmittler.getAnzahlErfassungsgebieteFuerWurzelgebiet(wahl);
        hinweisAusgezwehlt = getMessage("header.ausgezaehlt.gebiet.insgsamt");
      } else {
        anzahlGebieteAusgezaehlt = ergebnisAuszaehlungsstandErmittler.getAnzahlGueltigeErgebniseingaengeFuerErgebnisUndGebiet(ergebnis, gebiet);
        anzahlErfassungsgebiete = ergebnisAuszaehlungsstandErmittler.getAnzahlErfassungsgebieteFuerGebiet(wahl, gebiet);
        hinweisAusgezwehlt = getMessage("header.ausgezaehlt.gebiet.unterhalb");
      }

      result.append(" - ");
      result.append(getMessage("header.ausgezaehlte.gebiete", anzahlGebieteAusgezaehlt, anzahlErfassungsgebiete));

      result.append(" (");
      result.append(hinweisAusgezwehlt);
      result.append(")");

      if (isNotBlank(ergebnis.getBemerkung())) {
        result.append(" - ");
        result.append(ergebnis.getBemerkung());
      }

      if (ZwischenergebnisberechnungBackgroundService.isErgebnisWirdGeradeBerechnet()) {
        result.append(" - ");
        result.append(getMessage("was.header.ergebnisberechnung.laeuft"));
      }
    } else {
      result.append(getMessage("was.header.ergebnisberechnung.deaktiviert"));
    }

    return result.toString();
  }

  protected void appendErgebniseingabestatus(StringBuilder result, Ergebnis ergebnis, Wahldurchfuehrungsgebiet gebiet) {
    result.append(" [");
    result.append(getMessage(gebiet.getErgebniseingabestatus(ergebnis)));
    result.append("]");
  }

  private Wahldurchfuehrungsgebiet getSelectedGebiet() {
    return wahldurchfuehrungsgebietSessionSelect.getEntity();
  }

  private boolean isErgebnisSelected() {
    return ergebnisSessionSelect.isSelected();
  }

  private Ergebnis getSelectedErgebnis() {
    return ergebnisSessionSelect.getEntity();
  }

  private boolean isGebietSelected() {
    return wahldurchfuehrungsgebietSessionSelect.isSelected();
  }
}
