
package de.ivu.elect.dokumente.wahlvorschlag;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.kandidatur.KandidaturOhnePruefungenDokument;

public class WahlvorschlagsdatenOhnePruefungenDocument extends AbstractWahlvorschlagsdatenDocument {

  private static final long serialVersionUID = 1L;

  @DocumentRepeat(value = "ListenkandidaturenOhnePruefungen", elementClass = KandidaturOhnePruefungenDokument.class, itemName = "kandidatur")
  public final List<KandidaturOhnePruefungenDokument> listenkandidaturenOhnePruefungen;

  @DocumentRepeat(value = "ListenkandidaturenNachStimmzettelPositionOhnePruefungen", elementClass = KandidaturOhnePruefungenDokument.class, itemName = "kandidatur")
  public final List<KandidaturOhnePruefungenDokument> listenkandidaturenNachStimmzettelPositionOhnePruefungen;

  public WahlvorschlagsdatenOhnePruefungenDocument(CoreElectContext coreElectContext, Gebiet gebiet, WahlvorschlagCoreDaten wahlvorschlagCoreDaten, Wahlvorschlag wahlvorschlag, Long laufendeNummer) {
    super(coreElectContext, gebiet, wahlvorschlagCoreDaten, wahlvorschlag, laufendeNummer);

    if (this.isListe) {
      Liste liste = wahlvorschlag.castTo(Liste.class).getEntity();

      this.listenkandidaturenOhnePruefungen = konvertiereListenkandidaturenOhnePruefungStandardSortierung(liste, this.konvertierteListenkandidaturenOhnePruefungen);
      this.listenkandidaturenNachStimmzettelPositionOhnePruefungen = konvertiereListenkandidaturenOhnePruefungSortiertNachStimmzettelPosition(liste,
          wahlvorschlagCoreDaten.getEntityAufStimmzettelDaten(), this.konvertierteListenkandidaturenOhnePruefungen);
    } else {
      this.listenkandidaturenOhnePruefungen = new ArrayList<>();
      this.listenkandidaturenNachStimmzettelPositionOhnePruefungen = new ArrayList<>();
    }
  }

  private List<KandidaturOhnePruefungenDokument> konvertiereListenkandidaturenOhnePruefungSortiertNachStimmzettelPosition(Liste liste, EntityAufStimmzettelDaten entityAufStimmzettelDaten,
      Map<Listenkandidatur, KandidaturOhnePruefungenDokument> konvertierteListenkandidaturenOhnePruefungen) {
    List<KandidaturOhnePruefungenDokument> result = new ArrayList<>();

    for (Listenkandidatur listenkandidatur : getListenkandidaturenNachStimmzettelSortierung(liste, entityAufStimmzettelDaten)) {
      result.add(konvertierteListenkandidaturenOhnePruefungen.get(listenkandidatur));
    }

    return result;
  }

  private List<KandidaturOhnePruefungenDokument> konvertiereListenkandidaturenOhnePruefungStandardSortierung(Liste liste,
      Map<Listenkandidatur, KandidaturOhnePruefungenDokument> konvertierteListenkandidaturenOhnePruefungen) {
    List<KandidaturOhnePruefungenDokument> result = new ArrayList<>();

    for (Listenkandidatur listenkandidatur : getListenkandidaturenNachStandardSortierung(liste)) {
      result.add(konvertierteListenkandidaturenOhnePruefungen.get(listenkandidatur));
    }

    return result;
  }
}
