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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.internet.control.GebietUndStimmabgabeart;
import de.ivu.elect.dokumente.CoreElectContext;

public class GebietMitReferendumVorlagenDocument extends GebietMitStimmenUndWahlausschussDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Quorum/Prozenthuerde")
  public final BigDecimal quorum;

  @DocumentSimpleField("AnzahlNotwendigerStimmenFuerQuorum")
  public final Long anzahlNotwendigerStimmenFuerQuorum;

  @DocumentRepeat(value = "ReferendumVorlagen", elementClass = ReferendumVorlageMitStimmergebnissenDocument.class, itemName = "referendumVorlage")
  public final List<ReferendumVorlageMitStimmergebnissenDocument> referendumVorlagen;

  public GebietMitReferendumVorlagenDocument(CoreElectContext coreElectContext, ErgebnisDaten ergebnisDaten, GebietUndStimmabgabeart gebietUndStimmabgabeart,
      GebietMitStimmenDocument wahlgebietUebergeordnet) {
    super(coreElectContext, ergebnisDaten, gebietUndStimmabgabeart, wahlgebietUebergeordnet);

    this.quorum = ergebnisDaten.getWahl().getQuorumProzenthuerde();

    this.anzahlNotwendigerStimmenFuerQuorum = gebietUndStimmabgabeart.getWahldurchfuehrungsgebiet().getQuorumAnzahlGueltigeStimmen();

    this.referendumVorlagen = bestimmeReferendumVorlagen(coreElectContext, ergebnisDaten, gebietUndStimmabgabeart);
  }

  private List<ReferendumVorlageMitStimmergebnissenDocument> bestimmeReferendumVorlagen(CoreElectContext coreElectContext, ErgebnisDaten ergebnisDaten,
      GebietUndStimmabgabeart gebietUndStimmabgabeart) {
    List<ReferendumVorlageMitStimmergebnissenDocument> result = new ArrayList<>();

    Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = gebietUndStimmabgabeart.getWahldurchfuehrungsgebiet();

    List<GruppeImGebiet> referendumVorlagenSorted = ergebnisDaten.getWahldaten().getReferendumVorlagenSortiertNachPositionAufGebiet(wahldurchfuehrungsgebiet).stream() //
        .map(referendumVorlage -> ergebnisDaten.getGruppeImGebiet(referendumVorlage, wahldurchfuehrungsgebiet)) //
        .collect(Collectors.toList());

    for (int i = 0; i < referendumVorlagenSorted.size(); i++) {
      result.add(new ReferendumVorlageMitStimmergebnissenDocument(coreElectContext, ergebnisDaten, gebietUndStimmabgabeart, referendumVorlagenSorted.get(i), i + 1L));
    }

    return result;
  }
}
