
package de.ivu.elect.dokumente.wahl;

import java.util.function.Function;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.wahl.entity.UmgangAWerte;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.dokumente.BaseElectContext;

public class UmgangWahlberechtigteDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Wahlberechtigte-Ohne-Wahlschein-Zu-Erfassen")
  public final boolean wahlberechtigteOhneWahlscheinZuErfassen;

  @DocumentSimpleField("Wahlberechtigte-Ohne-Wahlschein-Anzuzeigen")
  public final boolean wahlberechtigteOhneWahlscheinAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Ohne-Wahlschein-Zu-Erfassen-Oder-Anzuzeigen")
  public final boolean wahlberechtigteOhneWahlscheinZuErfassenOderAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Mit-Wahlschein-Zu-Erfassen")
  public final boolean wahlberechtigteMitWahlscheinZuErfassen;

  @DocumentSimpleField("Wahlberechtigte-Mit-Wahlschein-Anzuzeigen")
  public final boolean wahlberechtigteMitWahlscheinAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Mit-Wahlschein-Zu-Erfassen-Oder-Anzuzeigen")
  public final boolean wahlberechtigteMitWahlscheinZuErfassenOderAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Nicht-Im-Waehlerverzeichnis-Zu-Erfassen")
  public final boolean wahlberechtigteNichtImWaehlerverzeichnisZuErfassen;

  @DocumentSimpleField("Wahlberechtigte-Nicht-Im-Waehlerverzeichnis-Anzuzeigen")
  public final boolean wahlberechtigteNichtImWaehlerverzeichnisAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Nicht-Im-Waehlerverzeichnis-Zu-Erfassen-Oder-Anzuzeigen")
  public final boolean wahlberechtigteNichtImWaehlerverzeichnisZuErfassenOderAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Gesamt-Zu-Erfassen")
  public final boolean wahlberechtigteGesamtZuErfassen;

  @DocumentSimpleField("Wahlberechtigte-Gesamt-Anzuzeigen")
  public final boolean wahlberechtigteGesamtAnzuzeigen;

  @DocumentSimpleField("Wahlberechtigte-Gesamt-Zu-Erfassen-Oder-Anzuzeigen")
  public final boolean wahlberechtigteGesamtZuErfassenOderAnzuzeigen;

  public UmgangWahlberechtigteDocument(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    super();

    UmgangAWerte umgangWahlberechtigteOhneWahlschein = getUmgangWahlberechtigteOhneWahlschein(baseElectContext, wahlartErgebnisart);
    this.wahlberechtigteOhneWahlscheinZuErfassen = umgangWahlberechtigteOhneWahlschein.isAWertBeiStimmeingabeZuErfassen();
    this.wahlberechtigteOhneWahlscheinAnzuzeigen = umgangWahlberechtigteOhneWahlschein.isAWertBeiStimmeingabeAnzuzeigen();
    this.wahlberechtigteOhneWahlscheinZuErfassenOderAnzuzeigen = umgangWahlberechtigteOhneWahlschein.isAWertBeiStimmeingabeZuErfassenOderAnzuzeigen();

    UmgangAWerte umgangWahlberechtigteMitWahlschein = getUmgangWahlberechtigteMitWahlschein(baseElectContext, wahlartErgebnisart);
    this.wahlberechtigteMitWahlscheinZuErfassen = umgangWahlberechtigteMitWahlschein.isAWertBeiStimmeingabeZuErfassen();
    this.wahlberechtigteMitWahlscheinAnzuzeigen = umgangWahlberechtigteMitWahlschein.isAWertBeiStimmeingabeAnzuzeigen();
    this.wahlberechtigteMitWahlscheinZuErfassenOderAnzuzeigen = umgangWahlberechtigteMitWahlschein.isAWertBeiStimmeingabeZuErfassenOderAnzuzeigen();

    UmgangAWerte umgangWahlberechtigteNichtImWaehlerverzeichnis = getUmgangWahlberechtigteNichtImWaehlerverzeichnis(baseElectContext, wahlartErgebnisart);
    this.wahlberechtigteNichtImWaehlerverzeichnisZuErfassen = umgangWahlberechtigteNichtImWaehlerverzeichnis.isAWertBeiStimmeingabeZuErfassen();
    this.wahlberechtigteNichtImWaehlerverzeichnisAnzuzeigen = umgangWahlberechtigteNichtImWaehlerverzeichnis.isAWertBeiStimmeingabeAnzuzeigen();
    this.wahlberechtigteNichtImWaehlerverzeichnisZuErfassenOderAnzuzeigen = umgangWahlberechtigteNichtImWaehlerverzeichnis.isAWertBeiStimmeingabeZuErfassenOderAnzuzeigen();

    UmgangAWerte umgangWahlberechtigteGesamt = getUmgangWahlberechtigteGesamt(baseElectContext, wahlartErgebnisart);
    this.wahlberechtigteGesamtZuErfassen = umgangWahlberechtigteGesamt.isAWertBeiStimmeingabeZuErfassen();
    this.wahlberechtigteGesamtAnzuzeigen = umgangWahlberechtigteGesamt.isAWertBeiStimmeingabeAnzuzeigen();
    this.wahlberechtigteGesamtZuErfassenOderAnzuzeigen = umgangWahlberechtigteGesamt.isAWertBeiStimmeingabeZuErfassenOderAnzuzeigen();
  }

  private UmgangAWerte getUmgangWahlberechtigteOhneWahlschein(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWahlberechtigte(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangAOhneWahlscheinVorlaeufig, Wahlart::getUmgangAOhneWahlscheinEndgueltig);
  }

  private UmgangAWerte getUmgangWahlberechtigteMitWahlschein(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWahlberechtigte(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangAMitWahlscheinVorlaeufig, Wahlart::getUmgangAMitWahlscheinEndgueltig);
  }

  private UmgangAWerte getUmgangWahlberechtigteNichtImWaehlerverzeichnis(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWahlberechtigte(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangANichtImWaehlerverzeichnisVorlaeufig, Wahlart::getUmgangANichtImWaehlerverzeichnisEndgueltig);
  }

  private UmgangAWerte getUmgangWahlberechtigteGesamt(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWahlberechtigte(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangAGesamtVorlaeufig, Wahlart::getUmgangAGesamtEndgueltig);
  }

  private UmgangAWerte getUmgangWahlberechtigte(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart, Function<Wahlart, UmgangAWerte> getterVorlaeufig,
      Function<Wahlart, UmgangAWerte> getterEndgueltig) {
    if (baseElectContext != null && wahlartErgebnisart != null) {
      Wahl wahl = baseElectContext.getWahl();

      if (wahl != null) {
        Wahlart wahlart = wahl.getWahlart();

        if (wahlart != null) {
          if (wahlartErgebnisart.isVorlaeufig()) {
            return getterVorlaeufig.apply(wahlart);
          }

          if (wahlartErgebnisart.isEndgueltig()) {
            return getterEndgueltig.apply(wahlart);
          }
        }
      }
    }

    return UmgangAWerte.NICHT_VORHANDEN;
  }
}
