
package de.ivu.elect.dokumente.ergebnis;

import static java.util.stream.Collectors.toList;

import java.util.LinkedList;
import java.util.List;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentQueue;
import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.elect.business.ergebnis.control.NlErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.NlErgebnisDatenGueltige;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;

public class ListenstimmenProGruppeTabelleDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentQueue(value = "Kopfzeilen-Gebietsnummer", elementClass = String.class)
  public final LinkedList<String> gebietsnummerKopfzeilen;

  @DocumentQueue(value = "Kopfzeilen-Gebietsname", elementClass = String.class)
  public final LinkedList<String> gebietsnameKopfzeilen; // ELECT-13547

  @DocumentQueue(value = "Anzahlen-Stimmen-Blanko", elementClass = Long.class)
  public final LinkedList<Long> blankoStimmen;

  @DocumentQueue(value = "Anzahlen-Stimmen-Ungueltig", elementClass = Long.class)
  public final LinkedList<Long> ungueltigeStimmen;

  @DocumentQueue(value = "Anzahlen-Stimmen-Gueltig", elementClass = Long.class)
  public final LinkedList<Long> gueltigeStimmen;

  @DocumentQueue(value = "Anzahlen-Stimmen-Gueltig-Erfasst", elementClass = Long.class)
  public final LinkedList<Long> summeListenstimmenProGebiet;

  @DocumentQueue(value = "Anzahlen-Stimmen-Gueltig-Erfasst-Gewichtet", elementClass = Long.class)
  public final LinkedList<Long> summeListenstimmenProGebietGewichtetMitVoteValues;

  @DocumentRepeat(value = "Stimmen-Pro-Gruppe-Zeilen", elementClass = ListenstimmenProGruppeZeileDocument.class, itemName = "gruppe")
  public final List<ListenstimmenProGruppeZeileDocument> listenstimmenFuerGruppe;

  public ListenstimmenProGruppeTabelleDocument(NlErgebnisDatenCustomDataDocumentContext context) {
    super();

    NlErgebnisDaten nlErgebnisDaten = context.getNlErgebnisDaten();
    NlErgebnisDatenGueltige nlErgebnisDatenGueltige = context.getNlErgebnisDatenGueltige();
    Stimmabgabeart stimmabgabeart = context.getStimmabgabeart();

    List<Wahldurchfuehrungsgebiet> wahlkreise = context.getWahlkreise();

    this.gebietsnummerKopfzeilen = new LinkedList<>(AbstractNlKandidatenStimmenProListeDocument.erzeugeKopfzeileGebietsnummer(wahlkreise));
    this.gebietsnameKopfzeilen = new LinkedList<>(AbstractNlKandidatenStimmenProListeDocument.erzeugeKopfzeileGebietsname(wahlkreise));

    this.blankoStimmen = new LinkedList<>();
    this.ungueltigeStimmen = new LinkedList<>();
    this.gueltigeStimmen = new LinkedList<>();

    this.summeListenstimmenProGebiet = new LinkedList<>();
    this.summeListenstimmenProGebietGewichtetMitVoteValues = new LinkedList<>();

    for (Wahldurchfuehrungsgebiet wahlkreis : wahlkreise) {
      this.blankoStimmen.add(nlErgebnisDatenGueltige.getSummeBlankoListenstimmen(wahlkreis, stimmabgabeart));
      this.ungueltigeStimmen.add(nlErgebnisDatenGueltige.getSummeUngueltigeListenstimmen(wahlkreis, stimmabgabeart));
      this.gueltigeStimmen.add(nlErgebnisDatenGueltige.getSummeGueltigeListenstimmen(wahlkreis, stimmabgabeart));

      this.summeListenstimmenProGebiet.add(nlErgebnisDaten.getSummeGebietListenstimmen(wahlkreis, stimmabgabeart));
      this.summeListenstimmenProGebietGewichtetMitVoteValues.add(nlErgebnisDaten.getSummeGebietListenstimmenGewichtetMitVoteValues(wahlkreis, stimmabgabeart));
    }

    this.listenstimmenFuerGruppe = context.getPolitischeGruppenSortedByPosition().stream() //
        .map(politischeGruppe -> new ListenstimmenProGruppeZeileDocument(context, wahlkreise, politischeGruppe)) //
        .collect(toList());
  }
}
