
package de.ivu.elect.dokumente.wahlvorschlag;

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

import de.ivu.document.generator.template.annotations.Document;
import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahlvorschlag.entity.Direktkandidat;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlagsdokument;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.ElectDocument;
import de.ivu.elect.dokumente.PersonDokument;
import de.ivu.elect.dokumente.gebiet.GebietDokument;
import de.ivu.elect.dokumente.kandidatur.DirektkandidaturDokument;
import de.ivu.elect.dokumente.kandidatur.KandidaturCoreDaten;

@Document(DokumentVorlageArt.WAHLVORSCHLAG_EMPFANGSQUITTUNG_DOKUMENT_PREFIX)
public class WahlvorschlagEmpfangsquittungDocument extends ElectDocument {

  private static final long serialVersionUID = 1L;

  @DocumentComplexField("Wahlgebiet-Uebergeordnet")
  public final GebietDokument wahlgebietUebergeordnet; // ELECT-10119

  @DocumentSimpleField("Zustellart")
  public final String zustellart;

  @DocumentComplexField("Empfänger")
  public final PersonDokument empfaenger;

  @DocumentRepeat(value = "Dokumente", elementClass = WahlvorschlagsDokumentDocument.class, itemName = "wahlvorschlagsDokumenteItem")
  public final List<WahlvorschlagsDokumentDocument> wahlvorschlagsDokumente;

  @DocumentComplexField("Wahlvorschlag")
  public final CoreWahlvorschlagsdatenDocument wahlvorschlag;

  @DocumentSimpleField("WahlvorschlagIstDirektkandidatur")
  public final boolean wahlvorschlagIstDirektkandidatur;

  @DocumentComplexField("Direktkandidatur")
  public final DirektkandidaturDokument direktkandidatur;

  public WahlvorschlagEmpfangsquittungDocument(CoreElectContext coreElectContext, Wahlvorschlag wahlvorschlag, List<Wahlvorschlagsdokument> wahlvorschlagsdokumente,
      KandidaturCoreDaten kandidaturCoreDaten, Personendaten empfaenger, String zustellart) {
    super(coreElectContext);

    Gebiet gebiet = wahlvorschlag.getGebiet();
    Gebiet uebergeordnetesWahlgebiet = gebiet.getUebergeordnetesWahlgebiet();

    // Wahlgebiet als Feld ermöglicht bspw. auch Zugriff auf CustomData-Werte und -Funktionen, cf. NlWusGebietCustomDataDocumentBuilder!
    this.wahlgebietUebergeordnet = uebergeordnetesWahlgebiet == null ? GebietDokument.EMPTY_OBJECT : new GebietDokument(coreElectContext, uebergeordnetesWahlgebiet);

    this.wahlvorschlag = new CoreWahlvorschlagsdatenDocument(coreElectContext, kandidaturCoreDaten.getEntityAufStimmzettelDaten(), wahlvorschlag, 1L);

    this.wahlvorschlagIstDirektkandidatur = wahlvorschlag.isDirektkandidat();

    if (this.wahlvorschlagIstDirektkandidatur) {
      this.direktkandidatur = new DirektkandidaturDokument(coreElectContext, this.wahlvorschlag, kandidaturCoreDaten, wahlvorschlag.castTo(Direktkandidat.class).getEntity().getDirektkandidatur());
    } else {
      this.direktkandidatur = DirektkandidaturDokument.EMPTY_OBJECT;
    }

    this.wahlvorschlagsDokumente = mapWahlvorschlagsdokumente(coreElectContext, wahlvorschlagsdokumente);

    this.zustellart = zustellart;
    this.empfaenger = new PersonDokument(coreElectContext, empfaenger);
  }

  private static List<WahlvorschlagsDokumentDocument> mapWahlvorschlagsdokumente(CoreElectContext coreElectContext, List<Wahlvorschlagsdokument> wahlvorschlagsdokumente) {
    List<WahlvorschlagsDokumentDocument> result = new ArrayList<>(wahlvorschlagsdokumente.size());

    for (Wahlvorschlagsdokument wahlvorschlagsdokument : wahlvorschlagsdokumente) {
      result.add(new WahlvorschlagsDokumentDocument(coreElectContext, wahlvorschlagsdokument));
    }

    return result;
  }
}
