
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();
    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);
    }

    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.summeListenkandidatStimmenQueueAnzahlStimmen.clear();
    clear(zeilenBerechenbar);

    addToSummen(zeilenBerechenbar);

    document.summenListenkandidatStimmenQueueNummer.addAll(listenkandidatStimmenQueueNummer);
    document.summenListenkandidatStimmenQueueNummerMitPartei.addAll(listenkandidatStimmenQueueNummerMitPartei);
    document.summenListenkandidatStimmenQueueKurzName.addAll(listenkandidatStimmenQueueName);
    document.summeListenkandidatStimmenQueueAnzahlStimmen.addAll(listenkandidatStimmenQueueAnzahlStimmen);

    return this;
  }

  private void clear(List<ErgebnisKandidaturenTabellarischDocumentZeile> zeilen) {
    clearListenkandidatStimmenQueue(zeilen);
    initWithZero();
  }

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

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

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

      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;

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

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