
package de.ivu.elect.dokumente.wahlvorschlag;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlrechtspruefung.entity.Pruefkriterium;
import de.ivu.elect.business.wahlrechtspruefung.entity.WahlrechtspruefStatus;
import de.ivu.elect.business.wahlrechtspruefung.entity.Wahlrechtspruefung;
import de.ivu.elect.dokumente.BaseElectContext;
import de.ivu.elect.dokumente.kandidatur.DirektkandidaturDokument;
import de.ivu.elect.dokumente.kandidatur.KandidaturOhnePruefungenDokument;
import de.ivu.elect.dokumente.kandidatur.ListenkandidaturDokument;

public class WahlvorschlagpruefungDokument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("ID")
  public final Long id;

  @DocumentSimpleField("FristInTagenBisZurWahlAnPrüfkriterium")
  public final Long fristInTagenBisZurWahlAnPruefkriterium;

  @DocumentSimpleField("FristEndetAmPruefkriterium")
  public final String fristEndetAmPruefkriterium;

  @DocumentSimpleField("FristInTagenBisZurWahlAnPrüfung")
  public final Long fristInTagenBisZurWahlAnPruefung;

  @DocumentSimpleField("FristEndetAmPrüfung")
  public final String fristEndetAmPruefung;

  @DocumentSimpleField("Heilungsfähig")
  public final boolean heilungsfaehig;

  @DocumentSimpleField("KannIrrelevantSein")
  public final boolean kannIrrelevantSein;

  @DocumentSimpleField("WahlrechtlichRelevant")
  public final boolean wahlrechtlichRelevant;

  @DocumentSimpleField("Kategorie")
  public final String kategorie;

  @DocumentSimpleField("Unterategorie")
  public final String unterkategorie;

  @DocumentSimpleField("Kriteriumtext")
  public final String kriteriumtext;

  @DocumentSimpleField("BezugAuf")
  public final String bezugAuf;

  @DocumentSimpleField("PruefkriteriumGruppeArt")
  public final String pruefkriteriumGruppeArt;

  @DocumentSimpleField("TeilDerSofortPruefung")
  public final boolean teilDerSofortpruefung;

  @DocumentSimpleField("TextFürErfüllt")
  public final String textFuerErfuellt;

  @DocumentSimpleField("TextFürFrist")
  public final String textFuerFrist;

  @DocumentSimpleField("TextFürNichtErfüllt")
  public final String textFuerNichtErfuellt;

  @DocumentSimpleField("TextFürPrüfung")
  public final String textFuerPruefung;

  @DocumentSimpleField("Bemerkung")
  public final String bemerkung;

  @DocumentSimpleField("DirektkandidaturPruefung")
  public final boolean direktkandidaturPruefung;

  @DocumentSimpleField("ListenkandidaturPruefung")
  public final boolean listenkandidaturPruefung;

  @DocumentComplexField("Listenkandidatur")
  public final KandidaturOhnePruefungenDokument listenkandidatur;

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

  @DocumentSimpleField("ZulassungErlaubt")
  public final boolean zulassungErlaubt;

  @DocumentSimpleField("LaufendeNummer")
  public final Long laufendeNummer;

  @DocumentSimpleField("PositionPruefkriterium")
  public final Long positionPruefkriterium;

  @DocumentSimpleField("WahlrechtspruefStatus")
  public final String status;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-Ungeprueft")
  public final boolean isStatusUngeprueft;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-Erfuellt")
  public final boolean isStatusErfuellt;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-NichtErfuellt")
  public final boolean isStatusNichtErfuellt;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-FristGesetzt")
  public final boolean isStatusFristGesetzt;

  /**
   * @see WahlvorschlagpruefungDokument#isStatusFristGesetzt
   * @deprecated ELECT-10130
   */
  @Deprecated
  @DocumentSimpleField("FristGesetzt")
  public final boolean fristGesetzt;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-Irrelevant")
  public final boolean isStatusIrrelevant;

  @DocumentSimpleField("WahlrechtspruefStatus-Ist-IrrelevantOderUngeprueft")
  public final boolean isStatusIrrelevantOderUngeprueft;

  public WahlvorschlagpruefungDokument(BaseElectContext baseElectContext, Wahlrechtspruefung wahlrechtspruefung, Long laufendeNummer, KandidaturOhnePruefungenDokument listenkandidaturDokument,
                                       DirektkandidaturDokument direktkandidaturDokument) {
    super();
    WahlrechtspruefStatus wahlrechtspruefStatus = wahlrechtspruefung.getWahlrechtspruefStatus();
    Pruefkriterium pruefkriterium = wahlrechtspruefung.getPruefkriterium();

    Wahl wahl = pruefkriterium.getWahl();

    this.id = wahlrechtspruefung.getId();

    this.fristInTagenBisZurWahlAnPruefkriterium = pruefkriterium.getFristInTagenBisZurWahl();
    this.fristEndetAmPruefkriterium = baseElectContext.formatDateMedium(wahl.bestimmeStichtagVormWahltag(this.fristInTagenBisZurWahlAnPruefkriterium));
    this.heilungsfaehig = pruefkriterium.getHeilungsfaehig();
    this.kannIrrelevantSein = pruefkriterium.getKannIrrelevantSein();
    this.wahlrechtlichRelevant = pruefkriterium.getWahlrechtlichRelevant();
    this.kategorie = pruefkriterium.getKategorie();
    this.unterkategorie = pruefkriterium.getUnterkategorie();
    this.kriteriumtext = pruefkriterium.getKriteriumtext();
    this.bezugAuf = baseElectContext.getMessage(pruefkriterium.getPruefkriteriumBezug());
    this.pruefkriteriumGruppeArt = baseElectContext.getMessage(pruefkriterium.getPruefkriteriumGruppeArt());
    this.teilDerSofortpruefung = pruefkriterium.getTeilDerSofortpruefung();
    this.textFuerErfuellt = pruefkriterium.getTextFuerProtokollErfuellt();
    this.textFuerFrist = pruefkriterium.getTextFuerProtokollFrist();
    this.textFuerNichtErfuellt = pruefkriterium.getTextFuerProtokollNichtErfuellt();
    this.textFuerPruefung = wahlrechtspruefStatus.bestimmePassendenPrueftext(pruefkriterium);
    this.fristInTagenBisZurWahlAnPruefung = wahlrechtspruefung.getFristInTagenBisZurWahl();
    this.fristEndetAmPruefung = baseElectContext.formatDateMedium(wahl.bestimmeStichtagVormWahltag(this.fristInTagenBisZurWahlAnPruefung));
    this.bemerkung = wahlrechtspruefung.getBemerkung();

    this.direktkandidaturPruefung = direktkandidaturDokument != null;
    this.listenkandidaturPruefung = listenkandidaturDokument != null;

    if (direktkandidaturDokument == null) {
      this.direktkandidatur = DirektkandidaturDokument.EMPTY_OBJECT;
    } else {
      this.direktkandidatur = direktkandidaturDokument;
    }

    if (listenkandidaturDokument == null) {
      this.listenkandidatur = ListenkandidaturDokument.EMPTY_OBJECT;
    } else {
      this.listenkandidatur = listenkandidaturDokument;
    }

    this.zulassungErlaubt = wahlrechtspruefung.isZulassenErlaubt();
    this.laufendeNummer = laufendeNummer;
    this.positionPruefkriterium = pruefkriterium.getPosition();

    this.status = baseElectContext.getMessage(wahlrechtspruefStatus);
    this.isStatusUngeprueft = wahlrechtspruefStatus.isUngeprueft();
    this.isStatusErfuellt = wahlrechtspruefStatus.isErfuellt();
    this.isStatusNichtErfuellt = wahlrechtspruefStatus.isNichtErfuellt();
    this.isStatusFristGesetzt = wahlrechtspruefStatus.isFristGesetzt();
    this.fristGesetzt = this.isStatusFristGesetzt;
    this.isStatusIrrelevant = wahlrechtspruefStatus.isIrrelevant();
    this.isStatusIrrelevantOderUngeprueft = this.isStatusUngeprueft || this.isStatusIrrelevant;
  }
}
