
package de.ivu.elect.presentation.ergebnis.dokumente.gesamtergebnis;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenReferendumOptionen;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.DokumentFormatter;

// Cf. ReferendumOptionStimmenDocument!!!
public class ReferendumOptionMitStimmergebnissenDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Position")
  public final Long position;

  @DocumentSimpleField("Position-Formatiert")
  public final String positionFormatted;

  @DocumentSimpleField("Kennzahl-Formatiert")
  public final String kennzahlFormatted;

  /**
   * @deprecated
   *
   * @see ReferendumOptionMitStimmergebnissenDocument#option
   */
  @Deprecated
  @DocumentSimpleField("Option")
  public final String option;

  @DocumentSimpleField("Label")
  public final String label; // Option auf dem Stimmzettel

  @DocumentSimpleField("Kurzbezeichnung")
  public final String kurzbezeichnung;

  @DocumentSimpleField("KurzbezeichnungWennGesetztSonstLabel")
  public final String kurzbezeichnungWennGesetztSonstLabel;

  @DocumentSimpleField("AnzahlGueltigerStimmen")
  public final Long anzahlGueltigerStimmen;

  // ELECT-3760
  @DocumentSimpleField("AnzahlGueltigerStimmen-Urnenwaehler")
  public final Long anzahlGueltigerStimmenUrnenwaehler;

  // ELECT-3760
  @DocumentSimpleField("AnzahlGueltigerStimmen-Briefwaehler")
  public final Long anzahlGueltigerStimmenBriefwaehler;

  public ReferendumOptionMitStimmergebnissenDocument(CoreElectContext coreElectContext, ErgebnisDaten ergebnisDaten, GebietUndStimmabgabeart gebietUndStimmabgabeart,
      ReferendumOption referendumOption) {
    super();

    // ELECT-9374, cf. AbstractStimmeingabeDocumentFactory#fillInReferendumOptionStimmenDocument!
    this.position = referendumOption.getPosition();

    this.positionFormatted = DokumentFormatter.formatNumber(referendumOption.getPosition(), coreElectContext.getLocale());
    this.kennzahlFormatted = this.positionFormatted;

    this.option = referendumOption.getLabel();
    this.label = this.option;

    this.kurzbezeichnung = referendumOption.getKurzbezeichnung();
    this.kurzbezeichnungWennGesetztSonstLabel = referendumOption.getKurzbezeichnungWennGesetztSonstLabel();

    Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = gebietUndStimmabgabeart.getWahldurchfuehrungsgebiet();
    ErgebnisDatenReferendumOptionen ergebnisDatenReferendumOptionen = ergebnisDaten.getErgebnisDatenReferendumOptionen();

    long anzahlStimmenGueltig = ergebnisDatenReferendumOptionen.getStimmenFuerReferendumOption(referendumOption, gebietUndStimmabgabeart);
    long anzahlStimmenGueltigUrnenwahl = 0L;
    long anzahlStimmenGueltigBriefwahl = 0L;

    for (Wahldurchfuehrungsgebiet erfassungsgebiet : ergebnisDaten.getErfassungsgebiete()) {
      if (erfassungsgebiet.isUntergebietVon(wahldurchfuehrungsgebiet)) {
        Stimmabgabeart stimmabgabeart = Stimmabgabeart.GESAMT; // Gebietsart ist bereits auf Erfassungsgebiet eingeschränkt!

        long anzahlStimmenImErfassungsgebietGueltig = ergebnisDatenReferendumOptionen.getStimmenFuerReferendumOption(referendumOption, erfassungsgebiet, stimmabgabeart);

        if (erfassungsgebiet.isUrnenwahlgebiet()) {
          anzahlStimmenGueltigUrnenwahl += anzahlStimmenImErfassungsgebietGueltig;
        } else {
          anzahlStimmenGueltigBriefwahl += anzahlStimmenImErfassungsgebietGueltig;
        }
      }
    }

    this.anzahlGueltigerStimmen = anzahlStimmenGueltig;
    this.anzahlGueltigerStimmenUrnenwaehler = anzahlStimmenGueltigUrnenwahl;
    this.anzahlGueltigerStimmenBriefwaehler = anzahlStimmenGueltigBriefwahl;
  }
}
