
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.UmgangBWerte;
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 UmgangWaehlerDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Waehler-Ohne-Wahlschein-Zu-Erfassen")
  public final boolean waehlerOhneWahlscheinZuErfassen;

  @DocumentSimpleField("Waehler-Ohne-Wahlschein-Anzuzeigen")
  public final boolean waehlerOhneWahlscheinAnzuzeigen;

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

  @DocumentSimpleField("Waehler-Mit-Wahlschein-Zu-Erfassen")
  public final boolean waehlerMitWahlscheinZuErfassen;

  @DocumentSimpleField("Waehler-Mit-Wahlschein-Anzuzeigen")
  public final boolean waehlerMitWahlscheinAnzuzeigen;

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

  @DocumentSimpleField("Waehler-Gesamt-Zu-Erfassen")
  public final boolean waehlerGesamtZuErfassen;

  @DocumentSimpleField("Waehler-Gesamt-Anzuzeigen")
  public final boolean waehlerGesamtAnzuzeigen;

  @DocumentSimpleField("Waehler-Gesamt-Zu-Erfassen-Oder-Anzuzeigen")
  public final boolean waehlerGesamtZuErfassenOderAnzuzeigen;

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

    UmgangBWerte umgangWaehlerOhneWahlschein = getUmgangWaehlerOhneWahlschein(baseElectContext, wahlartErgebnisart);
    this.waehlerOhneWahlscheinZuErfassen = umgangWaehlerOhneWahlschein.isBWertBeiStimmeingabeZuErfassen();
    this.waehlerOhneWahlscheinAnzuzeigen = umgangWaehlerOhneWahlschein.isBWertBeiStimmeingabeAnzuzeigen();
    this.waehlerOhneWahlscheinZuErfassenOderAnzuzeigen = umgangWaehlerOhneWahlschein.isBWertBeiStimmeingabeZuErfassenOderAnzuzeigen();

    UmgangBWerte umgangWaehlerMitWahlschein = getUmgangWaehlerMitWahlschein(baseElectContext, wahlartErgebnisart);
    this.waehlerMitWahlscheinZuErfassen = umgangWaehlerMitWahlschein.isBWertBeiStimmeingabeZuErfassen();
    this.waehlerMitWahlscheinAnzuzeigen = umgangWaehlerMitWahlschein.isBWertBeiStimmeingabeAnzuzeigen();
    this.waehlerMitWahlscheinZuErfassenOderAnzuzeigen = umgangWaehlerMitWahlschein.isBWertBeiStimmeingabeZuErfassenOderAnzuzeigen();

    UmgangBWerte umgangWaehlerGesamt = getUmgangWaehlerGesamt(baseElectContext, wahlartErgebnisart);
    this.waehlerGesamtZuErfassen = umgangWaehlerGesamt.isBWertBeiStimmeingabeZuErfassen();
    this.waehlerGesamtAnzuzeigen = umgangWaehlerGesamt.isBWertBeiStimmeingabeAnzuzeigen();
    this.waehlerGesamtZuErfassenOderAnzuzeigen = umgangWaehlerGesamt.isBWertBeiStimmeingabeZuErfassenOderAnzuzeigen();
  }

  private UmgangBWerte getUmgangWaehlerOhneWahlschein(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWaehler(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangBOhneWahlscheinVorlaeufig, Wahlart::getUmgangBOhneWahlscheinEndgueltig);
  }

  private UmgangBWerte getUmgangWaehlerMitWahlschein(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWaehler(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangBMitWahlscheinVorlaeufig, Wahlart::getUmgangBMitWahlscheinEndgueltig);
  }

  private UmgangBWerte getUmgangWaehlerGesamt(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart) {
    return getUmgangWaehler(baseElectContext, wahlartErgebnisart, Wahlart::getUmgangBGesamtVorlaeufig, Wahlart::getUmgangBGesamtEndgueltig);
  }

  private UmgangBWerte getUmgangWaehler(BaseElectContext baseElectContext, WahlartErgebnisart wahlartErgebnisart, Function<Wahlart, UmgangBWerte> getterVorlaeufig,
      Function<Wahlart, UmgangBWerte> 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 UmgangBWerte.NICHT_VORHANDEN;
  }
}
