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

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.dokumente.DokumentFormatter;

/**
 * Berücksichtigt auch die Gebietsgruppierung
 */
public class WaehlerUndWahlbeteiligungMitVorperiodeAufGebiet extends BaseDocument {

  /** Wähler aktuell bezogen auf alle Wahlberechtigten = Wahlbeteiligung */
  @DocumentComplexField("Gesamt")
  public final AnzahlMitProzent waehlerGesamt;

  /** Wähler aktuell bezogen auf alle Wahlberechtigten = Wahlbeteiligung (alles Vorperiode) */
  @DocumentComplexField("GesamtVorperiode")
  public final AnzahlMitProzent waehlerGesamtVorperiode;

  @DocumentComplexField("GesamtDifferenz")
  public final AnzahlMitProzent waehlerGesamtDifferenz;

  /** Briefwähler bezogen auf alle Wähler */
  @DocumentComplexField("BriefwählerUnterWählerGesamt")
  public final AnzahlMitProzent briefwaehler;

  /** Briefwähler bezogen auf alle Wähler (beides Vorperiode) */
  @DocumentComplexField("BriefwahlVorperiode")
  public final AnzahlMitProzent briefwaehlerVorperiode;

  @DocumentComplexField("BriefwahlDifferenz")
  public final AnzahlMitProzent briefwaehlerDifferenz;

  /** Briefwähler bezogen auf alle Wahlberechtigten */
  @DocumentComplexField("BriefwählerUnterWahlberechtigte")
  public final AnzahlMitProzent briefwaehlerUnterWahlberechtigte;

  @DocumentComplexField("UrnenwählerUnterWahlberechtigte")
  public final AnzahlMitProzent urnenwaehlerUnterWahlberechtigte;

  public WaehlerUndWahlbeteiligungMitVorperiodeAufGebiet(ErgebnisDaten ergebnisDaten,
      GebietUndStimmabgabeart gebietUndStimmabgabeart, DokumentFormatter formatter) {

    // Wähler mit Vorperiode bezogen auf die Wahlberechtigten
    Long anzahlWaehler = ergebnisDaten.getWaehlerAktuellGesamt(gebietUndStimmabgabeart);
    Long anzahlWahlberechtigte = ergebnisDaten
        .getWahlberechtigteGesamtFuerErfassungsgebietUnterhalbVonAnzahl(gebietUndStimmabgabeart);
    this.waehlerGesamt = new AnzahlMitProzent(anzahlWaehler, anzahlWahlberechtigte, formatter);

    Long anzahlWaehlerVorperiode = ergebnisDaten.getWaehlerGesamtVorperiode(gebietUndStimmabgabeart);
    Long anzahlWahlberechtigteVorperiode = ergebnisDaten.getErgebnisDatenWahlberechtigteVorperiode()
        .getSummeWahlberechtigteGesamt(gebietUndStimmabgabeart);
    this.waehlerGesamtVorperiode = new AnzahlMitProzent(anzahlWaehlerVorperiode, anzahlWahlberechtigteVorperiode,
        formatter);

    this.waehlerGesamtDifferenz = AnzahlMitProzent.createDifferenz(anzahlWaehler, anzahlWahlberechtigte,
        anzahlWaehlerVorperiode, anzahlWahlberechtigteVorperiode, formatter);

    // Jetzt die Briefwähler mit Vorperiode, einmal bezogen auf alle Wähler, einmal bezogen auf die Wahlberechtigten
    GebietUndStimmabgabeart gebietUndBriefwahl = gebietUndStimmabgabeart.copy(Stimmabgabeart.BRIEF);

    Long anzahlBriefwaehler = ergebnisDaten.getWaehlerAktuellGesamt(gebietUndBriefwahl);
    Long anzahlBriefwaehlerVorperiode = ergebnisDaten.getWaehlerGesamtVorperiode(gebietUndBriefwahl);
    this.briefwaehler = new AnzahlMitProzent(anzahlBriefwaehler, anzahlWaehler, formatter);
    this.briefwaehlerUnterWahlberechtigte = new AnzahlMitProzent(anzahlBriefwaehler, anzahlWahlberechtigte, formatter);
    this.briefwaehlerVorperiode = new AnzahlMitProzent(anzahlBriefwaehlerVorperiode, anzahlWaehlerVorperiode,
        formatter);
    this.briefwaehlerDifferenz = AnzahlMitProzent.createDifferenz(anzahlBriefwaehler, anzahlWaehler,
        anzahlBriefwaehlerVorperiode, anzahlWaehlerVorperiode, formatter);

    // Jetzt die Urnenwähler (keine Vorperiode) bezogen auf die Wahlberechtigten
    GebietUndStimmabgabeart gebietUndUrnenwahl = gebietUndStimmabgabeart.copy(Stimmabgabeart.URNE);
    Long anzahlUrnenwaehler = ergebnisDaten.getWaehlerAktuellGesamt(gebietUndUrnenwahl);
    this.urnenwaehlerUnterWahlberechtigte = new AnzahlMitProzent(anzahlUrnenwaehler, anzahlWahlberechtigte, formatter);
  }

}
