
package de.ivu.elect.dokumente.kandidatur;

import static java.util.Collections.emptyList;

import java.util.ArrayList;
import java.util.Collection;
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.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.personenregister.entity.PersonenregisterPersonendatenAbweichung;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.dokumente.BaseElectContext;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.personenregister.PersonenregisterPersonendatenAbweichungDocument;
import de.ivu.elect.dokumente.wahlvorschlag.CoreWahlvorschlagsdatenDocument;
import de.ivu.elect.dokumente.wahlvorschlag.VerweigerungsGrundZulassungDocument;

public class KandidaturOhnePruefungenDokument extends CoreKandidaturDokument {

  private static final long serialVersionUID = 1L;

  @DocumentRepeat(value = "AlleVerweigerungsgruendeNichtZulassung", elementClass = VerweigerungsGrundZulassungDocument.class, itemName = "verweigerungsgrund")
  public final List<VerweigerungsGrundZulassungDocument> alleVerweigerungsgruendeNichtZulassung;

  @DocumentSimpleField("AlleVerweigerungsgruendeNichtZulassungVorhanden")
  public final boolean alleVerweigerungsgruendeNichtZulassungVorhanden;

  @Deprecated // ELECT-8795
  public final List<VerweigerungsGrundZulassungDocument> verweigerungsgruendeNichtZulassung;

  @Deprecated // ELECT-8795
  public final boolean verweigerungsgruendeNichtZulassungVorhanden;

  @DocumentRepeat(value = "PersonenregisterPersonendatenAbweichungen", elementClass = PersonenregisterPersonendatenAbweichungDocument.class, itemName = "personenregisterPersonendatenAbweichung")
  public final List<PersonenregisterPersonendatenAbweichungDocument> personenregisterPersonendatenAbweichungen;

  @DocumentSimpleField("PersonenregisterPersonendatenAbweichungenVorhanden")
  public final boolean personenregisterPersonendatenAbweichungenVorhanden;

  protected KandidaturOhnePruefungenDokument() {
    super();

    this.alleVerweigerungsgruendeNichtZulassung = new ArrayList<>();
    this.alleVerweigerungsgruendeNichtZulassungVorhanden = false;

    this.verweigerungsgruendeNichtZulassung = this.alleVerweigerungsgruendeNichtZulassung;
    this.verweigerungsgruendeNichtZulassungVorhanden = this.alleVerweigerungsgruendeNichtZulassungVorhanden;

    this.personenregisterPersonendatenAbweichungen = new ArrayList<>();
    this.personenregisterPersonendatenAbweichungenVorhanden = false;
  }

  public KandidaturOhnePruefungenDokument(CoreElectContext coreElectContext, CoreWahlvorschlagsdatenDocument wahlvorschlagsdatenDocument, KandidaturCoreDaten kandidaturCoreDaten,
      Kandidatur kandidatur, Long laufendeNummer) {
    this(coreElectContext, wahlvorschlagsdatenDocument, kandidaturCoreDaten, kandidatur, laufendeNummer, emptyList());
  }

  public KandidaturOhnePruefungenDokument(CoreElectContext coreElectContext, CoreWahlvorschlagsdatenDocument wahlvorschlagsdatenDocument, KandidaturCoreDaten kandidaturCoreDaten,
      Kandidatur kandidatur, Long laufendeNummer, Collection<PersonenregisterPersonendatenAbweichung> personenregisterPersonendatenAbweichungen) {
    super(coreElectContext, wahlvorschlagsdatenDocument, kandidaturCoreDaten, kandidatur, laufendeNummer);

    this.alleVerweigerungsgruendeNichtZulassung = createVerweigerungsGrundZulassungDocuments(kandidatur, kandidaturCoreDaten.getZulassungPruefer());
    this.alleVerweigerungsgruendeNichtZulassungVorhanden = !this.alleVerweigerungsgruendeNichtZulassung.isEmpty();

    this.verweigerungsgruendeNichtZulassung = this.alleVerweigerungsgruendeNichtZulassung;
    this.verweigerungsgruendeNichtZulassungVorhanden = this.alleVerweigerungsgruendeNichtZulassungVorhanden;

    this.personenregisterPersonendatenAbweichungen = createPersonenregisterPersonendatenAbweichungDocuments(coreElectContext, personenregisterPersonendatenAbweichungen);
    this.personenregisterPersonendatenAbweichungenVorhanden = !this.personenregisterPersonendatenAbweichungen.isEmpty();
  }

  private static List<VerweigerungsGrundZulassungDocument> createVerweigerungsGrundZulassungDocuments(Kandidatur kandidatur, ZulassungPruefer zulassungPruefer) {
    List<VerweigerungsGrundZulassungDocument> result = new ArrayList<>();

    for (String grund : zulassungPruefer.getGruendeFuerVerweigerungDerZulassung(kandidatur)) {
      result.add(new VerweigerungsGrundZulassungDocument(grund));
    }

    return result;
  }

  private static List<PersonenregisterPersonendatenAbweichungDocument> createPersonenregisterPersonendatenAbweichungDocuments(BaseElectContext baseElectContext,
      Collection<PersonenregisterPersonendatenAbweichung> personenregisterPersonendatenAbweichungen) {
    return personenregisterPersonendatenAbweichungen.stream()
        .map(personenregisterPersonendatenAbweichung -> new PersonenregisterPersonendatenAbweichungDocument(baseElectContext, personenregisterPersonendatenAbweichung)).collect(Collectors.toList());
  }
}
