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

import java.util.List;

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

public class ErgebnisKandidaturenTabellarischDocumentZeileSummen extends AbstractErgebnisKandidaturenTabellarischDocumentZeile {

  private static final long serialVersionUID = 1L;

  public ErgebnisKandidaturenTabellarischDocumentZeileSummen(WahlartErgebnisart ergebnisart) {
    super(ergebnisart, null);
  }

  public ErgebnisKandidaturenTabellarischDocumentZeileSummen setMetaData(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen, ErgebnisKandidaturenTabellarischDocument document) {
    List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilenBerechenbar = filterZeilenBerechenbar(zeilen);

    listenkandidatStimmenQueueNummer.clear();
    listenkandidatStimmenQueueNummerMitPartei.clear();
    listenkandidatStimmenQueueName.clear();
    listenkandidatStimmenQueueNameVollstaendig.clear();
    listenkandidatStimmenQueueVorname.clear();
    listenkandidatStimmenQueueAnzahlStimmen.clear();

    if (!zeilenBerechenbar.isEmpty()) {
      ErgebnisKandidaturenTabellarischDocumentZeile ersteZeile = zeilenBerechenbar.get(0);
      document.summenListenkandidatStimmenQueueNummer.addAll(ersteZeile.listenkandidatStimmenQueueNummer);
      document.summenListenkandidatStimmenQueueNummerMitPartei.addAll(ersteZeile.listenkandidatStimmenQueueNummerMitPartei);
      document.summenListenkandidatStimmenQueueKurzName.addAll(ersteZeile.listenkandidatStimmenQueueName);
      document.summenListenkandidatStimmenQueueKurzNameVollstaendig.addAll(ersteZeile.listenkandidatStimmenQueueNameVollstaendig);
      document.summenListenkandidatStimmenQueueVorname.addAll(ersteZeile.listenkandidatStimmenQueueVorname);
    }

    return this;
  }

  public ErgebnisKandidaturenTabellarischDocumentZeileSummen setSummen(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen, ErgebnisKandidaturenTabellarischDocument document) {
    List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilenBerechenbar = filterZeilenBerechenbar(zeilen);

    document.summenListenkandidatStimmenQueueNummer.clear();
    document.summenListenkandidatStimmenQueueNummerMitPartei.clear();
    document.summenListenkandidatStimmenQueueKurzName.clear();
    document.summenListenkandidatStimmenQueueKurzNameVollstaendig.clear();
    document.summenListenkandidatStimmenQueueVorname.clear();
    document.summeListenkandidatStimmenQueueAnzahlStimmen.clear();

    init(zeilenBerechenbar);

    addToSummen(zeilenBerechenbar);

    document.summenListenkandidatStimmenQueueNummer.addAll(listenkandidatStimmenQueueNummer);
    document.summenListenkandidatStimmenQueueNummerMitPartei.addAll(listenkandidatStimmenQueueNummerMitPartei);
    document.summenListenkandidatStimmenQueueKurzName.addAll(listenkandidatStimmenQueueName);
    document.summenListenkandidatStimmenQueueKurzNameVollstaendig.addAll(listenkandidatStimmenQueueNameVollstaendig);
    document.summenListenkandidatStimmenQueueVorname.addAll(listenkandidatStimmenQueueVorname);
    document.summeListenkandidatStimmenQueueAnzahlStimmen.addAll(listenkandidatStimmenQueueAnzahlStimmen);

    return this;
  }

  private void init(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen) {
    initListenkandidatStimmenQueues(zeilen);
    initWithZero();
  }

  private void initListenkandidatStimmenQueues(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen) {
    listenkandidatStimmenQueueNummer.clear();
    listenkandidatStimmenQueueNummerMitPartei.clear();
    listenkandidatStimmenQueueName.clear();
    listenkandidatStimmenQueueNameVollstaendig.clear();
    listenkandidatStimmenQueueVorname.clear();
    listenkandidatStimmenQueueAnzahlStimmen.clear();

    if (!zeilen.isEmpty()) {
      ErgebnisKandidaturenTabellarischDocumentZeile ersteZeile = zeilen.get(0);
      listenkandidatStimmenQueueNummer.addAll(ersteZeile.listenkandidatStimmenQueueNummer);
      listenkandidatStimmenQueueNummerMitPartei.addAll(ersteZeile.listenkandidatStimmenQueueNummerMitPartei);
      listenkandidatStimmenQueueName.addAll(ersteZeile.listenkandidatStimmenQueueName);
      listenkandidatStimmenQueueNameVollstaendig.addAll(ersteZeile.listenkandidatStimmenQueueNameVollstaendig);
      listenkandidatStimmenQueueVorname.addAll(ersteZeile.listenkandidatStimmenQueueVorname);
      listenkandidatStimmenQueueAnzahlStimmen.addAll(ersteZeile.listenkandidatStimmenQueueAnzahlStimmen);
    }
  }

  private ErgebnisKandidaturenTabellarischDocumentZeileSummen addToSummen(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen) {
    for (ErgebnisKandidaturenTabellarischDocumentZeile zeile : zeilen) {
      parteiErststimmenAnzahl += fixNullToZero(zeile.parteiErststimmenAnzahl);

      parteiZweitstimmenAnzahl += fixNullToZero(zeile.parteiZweitstimmenAnzahl);
      parteiZweitstimmenNurListeAnzahl += fixNullToZero(zeile.parteiZweitstimmenNurListeAnzahl);
      parteiZweitstimmenNurListenkandidaturenAnzahl += fixNullToZero(zeile.parteiZweitstimmenNurListenkandidaturenAnzahl);

      for (int i = 0; i < zeile.listenkandidatStimmenQueueAnzahlStimmen.size(); i++) {
        Long zeileAnzahlStimmen = zeile.listenkandidatStimmenQueueAnzahlStimmen.get(i);
        Long summeAnzahlStimmen = listenkandidatStimmenQueueAnzahlStimmen.get(i);

        if (zeileAnzahlStimmen != null) {
          listenkandidatStimmenQueueAnzahlStimmen.set(i, summeAnzahlStimmen + zeileAnzahlStimmen);
        } else {
          Long aLong = listenkandidatStimmenQueueAnzahlStimmen.get(i);
          if (aLong != null && aLong == 0L) {
            listenkandidatStimmenQueueAnzahlStimmen.set(i, null);
          }
        }
      }
    }

    return this;
  }

  private void initWithZero() {
    parteiErststimmenAnzahl = 0L;

    parteiZweitstimmenAnzahl = 0L;
    parteiZweitstimmenNurListeAnzahl = 0L;
    parteiZweitstimmenNurListenkandidaturenAnzahl = 0L;

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

  @Override
  public ErgebnisKandidaturenTabellarischDocumentZeileSummen copy() {
    return copyTo(new ErgebnisKandidaturenTabellarischDocumentZeileSummen(ergebnisart));
  }
}
