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

import java.util.List;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;

public class ErgebnisGesamtergebnisTabellarischDocumentZeileSummen extends AbstractErgebnisGesamtergebnisTabellarischDocumentZeile {

  private static final long serialVersionUID = 1L;

  public ErgebnisGesamtergebnisTabellarischDocumentZeileSummen(WahlartErgebnisart ergebnisart, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    super(ergebnisart, wahldurchfuehrungsgebiet);

    initWithZero();
  }

  public ErgebnisGesamtergebnisTabellarischDocumentZeileSummen setSummen(List<ErgebnisGesamtergebnisTabellarischDocumentZeile> zeilen) {
    List<ErgebnisGesamtergebnisTabellarischDocumentZeile> zeilenBerechenbar = filterZeilenBerechenbar(zeilen);

    berechneParteienSummenQueue(zeilenBerechenbar);
    initWithZero();
    addToSummen(zeilenBerechenbar);

    return this;
  }

  private void berechneParteienSummenQueue(List<ErgebnisGesamtergebnisTabellarischDocumentZeile> zeilen) {
    parteiStimmenQueueNummer.clear();
    parteiStimmenQueueKennung.clear();
    parteiStimmenQueueNameGruppe.clear();
    parteiStimmenQueueNameWahlvorschlag.clear();
    parteiStimmenQueueNameDirektkandidat.clear();
    parteiStimmenQueueAnzahlErststimmen.clear();
    parteiStimmenQueueAnzahlZweitstimmen.clear();

    if (!zeilen.isEmpty()) {
      ErgebnisGesamtergebnisTabellarischDocumentZeile ersteZeile = zeilen.get(0);
      parteiStimmenQueueNummer.addAll(ersteZeile.parteiStimmenQueueNummer);
      parteiStimmenQueueKennung.addAll(ersteZeile.parteiStimmenQueueKennung);
      parteiStimmenQueueNameGruppe.addAll(ersteZeile.parteiStimmenQueueNameGruppe);
      parteiStimmenQueueNameWahlvorschlag.addAll(ersteZeile.parteiStimmenQueueNameWahlvorschlag);
      parteiStimmenQueueNameDirektkandidat.addAll(ersteZeile.parteiStimmenQueueNameDirektkandidat);
      parteiStimmenQueueAnzahlErststimmen.addAll(ersteZeile.parteiStimmenQueueAnzahlErststimmen);
      parteiStimmenQueueAnzahlZweitstimmen.addAll(ersteZeile.parteiStimmenQueueAnzahlZweitstimmen);
    }
  }

  private ErgebnisGesamtergebnisTabellarischDocumentZeileSummen addToSummen(List<ErgebnisGesamtergebnisTabellarischDocumentZeile> zeilen) {
    for (ErgebnisGesamtergebnisTabellarischDocumentZeile zeile : zeilen) {
      wahlberechtigteOhneWahlschein += fixNullToZero(zeile.wahlberechtigteOhneWahlschein);
      wahlberechtigteMitWahlschein += fixNullToZero(zeile.wahlberechtigteMitWahlschein);
      wahlberechtigteNichtImWaehlerverzeichnis += fixNullToZero(zeile.wahlberechtigteNichtImWaehlerverzeichnis);
      wahlberechtigteGesamt += fixNullToZero(zeile.wahlberechtigteGesamt);

      // ELECT-8018, LEGACY!!!
      a1 += fixNullToZero(zeile.a1);
      a2 += fixNullToZero(zeile.a2);
      a3 += fixNullToZero(zeile.a3);
      a += fixNullToZero(zeile.a);

      waehlerOhneWahlschein += fixNullToZero(zeile.waehlerOhneWahlschein);
      waehlerMitWahlschein += fixNullToZero(zeile.waehlerMitWahlschein);
      waehlerMitWahlscheinAnteilAusUrnenwahl += fixNullToZero(zeile.waehlerMitWahlscheinAnteilAusUrnenwahl);
      waehlerMitWahlscheinAnteilAusBriefwahl += fixNullToZero(zeile.waehlerMitWahlscheinAnteilAusBriefwahl);
      waehlerGesamt += fixNullToZero(zeile.waehlerGesamt);

      // ELECT-8018, LEGACY!!!
      b1 += fixNullToZero(zeile.b1);
      b2 += fixNullToZero(zeile.b2);
      b += fixNullToZero(zeile.b);

      stimmzettelGueltig += fixNullToZero(zeile.stimmzettelGueltig);
      stimmzettelUngueltig += fixNullToZero(zeile.stimmzettelUngueltig);
      stimmzettelGesamt += fixNullToZero(zeile.stimmzettelGesamt);

      erststimmenGueltig += fixNullToZero(zeile.erststimmenGueltig);
      erststimmenUngueltig += fixNullToZero(zeile.erststimmenUngueltig);
      erststimmenGesamt += fixNullToZero(zeile.erststimmenGesamt);

      zweitstimmenGueltig += fixNullToZero(zeile.zweitstimmenGueltig);
      zweitstimmenUngueltig += fixNullToZero(zeile.zweitstimmenUngueltig);
      zweitstimmenGesamt += fixNullToZero(zeile.zweitstimmenGesamt);

      for (int i = 0; i < zeile.parteiStimmenQueueNummer.size(); i++) {
        Long summeAnzahlErststimmen = parteiStimmenQueueAnzahlErststimmen.get(i);
        Long zeileAnzahlErststimmen = zeile.parteiStimmenQueueAnzahlErststimmen.get(i);

        Long summeAnzahlZweitstimmen = parteiStimmenQueueAnzahlZweitstimmen.get(i);
        Long zeileAnzahlZweitstimmen = zeile.parteiStimmenQueueAnzahlZweitstimmen.get(i);

        if (summeAnzahlErststimmen != null) {
          if (zeileAnzahlErststimmen == null) {
            parteiStimmenQueueAnzahlErststimmen.set(i, summeAnzahlErststimmen);
          } else {
            parteiStimmenQueueAnzahlErststimmen.set(i, summeAnzahlErststimmen + zeileAnzahlErststimmen);
          }
        }

        if (summeAnzahlZweitstimmen != null) {
          if (zeileAnzahlZweitstimmen == null) {
            parteiStimmenQueueAnzahlZweitstimmen.set(i, summeAnzahlZweitstimmen);
          } else {
            parteiStimmenQueueAnzahlZweitstimmen.set(i, summeAnzahlZweitstimmen + zeileAnzahlZweitstimmen);
          }
        }
      }
    }

    return this;
  }

  private void initWithZero() {
    wahlberechtigteOhneWahlschein = 0L;
    wahlberechtigteMitWahlschein = 0L;
    wahlberechtigteNichtImWaehlerverzeichnis = 0L;
    wahlberechtigteGesamt = 0L;

    // ELECT-8018, LEGACY!!!
    a1 = 0L;
    a2 = 0L;
    a3 = 0L;
    a = 0L;

    waehlerOhneWahlschein = 0L;
    waehlerMitWahlschein = 0L;
    waehlerMitWahlscheinAnteilAusUrnenwahl = 0L;
    waehlerMitWahlscheinAnteilAusBriefwahl = 0L;
    waehlerGesamt = 0L;

    // ELECT-8018, LEGACY!!!
    b1 = 0L;
    b2 = 0L;
    b = 0L;

    stimmzettelGueltig = 0L;
    stimmzettelUngueltig = 0L;
    stimmzettelGesamt = 0L;

    erststimmenGueltig = 0L;
    erststimmenUngueltig = 0L;
    erststimmenGesamt = 0L;

    zweitstimmenGueltig = 0L;
    zweitstimmenUngueltig = 0L;
    zweitstimmenGesamt = 0L;

    for (int i = 0; i < parteiStimmenQueueNummer.size(); i++) {
      parteiStimmenQueueAnzahlErststimmen.set(i, 0L);
      parteiStimmenQueueAnzahlZweitstimmen.set(i, 0L);
    }
  }

  @Override
  public ErgebnisGesamtergebnisTabellarischDocumentZeileSummen copy() {
    return copyTo(new ErgebnisGesamtergebnisTabellarischDocumentZeileSummen(ergebnisart, wahldurchfuehrungsgebiet));
  }
}
