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

import javax.annotation.Nullable;

import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStimmzettelPosition;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.kandidatur.KandidaturCoreDaten;
import de.ivu.elect.dokumente.kandidatur.KandidaturDokument;
import de.ivu.elect.dokumente.wahlvorschlag.CoreWahlvorschlagsdatenDocument;
import de.ivu.elect.dokumente.wahlvorschlag.GruppeDokument;
import de.ivu.elect.was.exchange.internet.velocity.PolitischeGruppeProzentGewinnVerlust;

public class PolitischeGruppenErgebnisAufGebiet extends GruppenErgebnisAufGebiet {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("LaufendeNummer")
  public final Long laufendeNummer;

  /**
   * @deprecated
   * @see GesamtErgebnisDokument#gebieteMitDirektkandidaten
   */
  @Deprecated
  @DocumentComplexField("Direktkandidat")
  public final KandidaturDokument direktkandidat;

  /**
   * @deprecated
   * @see PolitischeGruppenErgebnisAufGebiet#stimmzettelPosition
   */
  @Deprecated
  @DocumentSimpleField("Stimmzettelposition")
  public final Long stimmzettelposition;

  @DocumentSimpleField("Stimmzettelposition")
  public final Long stimmzettelPosition;

  @DocumentSimpleField("Stimmzettelposition-Formatiert")
  public final String stimmzettelPositionFormatted;

  @DocumentSimpleField("Stimmzettelkennzahl-Formatiert")
  public final String stimmzettelKennzahlFormatted;

  @DocumentSimpleField("AnzahlSitze")
  public final Long anzahlSitze;

  @DocumentSimpleField("AnzahlSitzeAnspruch")
  public final Long anzahlSitzeAnspruch;

  @DocumentSimpleField("Direktstimmen-Absolute-Mehrheit-Erreicht")
  public final Boolean direktstimmenAbsoluteMehrheitErreicht;

  @DocumentSimpleField("Listenstimmen-Absolute-Mehrheit-Erreicht")
  public final Boolean listenstimmenAbsoluteMehrheitErreicht;

  @DocumentSimpleField("Gesamtstimmen-Absolute-Mehrheit-Erreicht")
  public final Boolean gesamtstimmenAbsoluteMehrheitErreicht;

  public PolitischeGruppenErgebnisAufGebiet(CoreElectContext coreElectContext, EntityAufStimmzettelDaten entityAufStimmzettelDaten, KandidaturCoreDaten kandidaturCoreDaten, GruppeDokument gruppe,
      Long laufendeNummer, Long anzahlSitze, Long anzahlSitzeAnspruch, @Nullable Direktkandidat direktkandidat, boolean direktstimmenAufGebietErfassbar,
      @Nullable PolitischeGruppeProzentGewinnVerlust direktstimmen, @Nullable Liste liste, boolean listenstimmenAufGebietErfassbar, @Nullable PolitischeGruppeProzentGewinnVerlust listenstimmen,
      @Nullable PolitischeGruppeProzentGewinnVerlust gesamtstimmen) {
    super(coreElectContext, gruppe, direktstimmenAufGebietErfassbar, direktstimmen, listenstimmenAufGebietErfassbar, listenstimmen, gesamtstimmen);

    this.laufendeNummer = laufendeNummer;

    Wahlvorschlag wahlvorschlag = liste;

    if (wahlvorschlag == null) {
      wahlvorschlag = direktkandidat;
    }

    if (wahlvorschlag == null) {
      this.stimmzettelPosition = laufendeNummer; //  in erster Näherung funktioniert die laufende Nummer als Stimmzettelposition laut .. ELECT-3541
      this.stimmzettelPositionFormatted = this.stimmzettelPosition == null ? "" : "" + this.stimmzettelPosition;
      this.stimmzettelKennzahlFormatted = this.stimmzettelPositionFormatted;
    } else {
      WahlvorschlagStimmzettelPosition wahlvorschlagStimmzettelPosition = wahlvorschlag.getStimmzettelPosition(entityAufStimmzettelDaten);

      this.stimmzettelPosition = wahlvorschlagStimmzettelPosition.getPosition();
      this.stimmzettelPositionFormatted = wahlvorschlagStimmzettelPosition.formatPosition();
      this.stimmzettelKennzahlFormatted = wahlvorschlagStimmzettelPosition.formatKennzahl();
    }

    this.anzahlSitze = anzahlSitze;
    this.anzahlSitzeAnspruch = anzahlSitzeAnspruch;

    if (direktkandidat == null) {
      this.direktkandidat = null;
    } else {
      this.direktkandidat = new KandidaturDokument(coreElectContext, new CoreWahlvorschlagsdatenDocument(coreElectContext, entityAufStimmzettelDaten, direktkandidat, laufendeNummer),
          kandidaturCoreDaten, direktkandidat.getDirektkandidatur());
    }

    this.stimmzettelposition = this.stimmzettelPosition;

    this.direktstimmenAbsoluteMehrheitErreicht = direktstimmen != null && direktstimmen.isAbsoluteMehrheitErreicht();
    this.listenstimmenAbsoluteMehrheitErreicht = listenstimmen != null && listenstimmen.isAbsoluteMehrheitErreicht();
    this.gesamtstimmenAbsoluteMehrheitErreicht = gesamtstimmen != null && gesamtstimmen.isAbsoluteMehrheitErreicht();
  }

  public boolean isAbsoluteMehrheitErreicht() {
    return direktstimmenAbsoluteMehrheitErreicht || listenstimmenAbsoluteMehrheitErreicht || gesamtstimmenAbsoluteMehrheitErreicht;
  }
}
