
package de.ivu.elect.dokumente.kandidatur;

import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatterKandidaturFormatDarstellung;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.PersonDokument;
import de.ivu.elect.dokumente.wahlvorschlag.CoreWahlvorschlagsdatenDocument;

public class KandidaturDokument extends PersonDokument {

  private static final long serialVersionUID = 1L;

  public static final KandidaturDokument EMPTY_OBJECT = new KandidaturDokument();

  /**
   * @deprecated
   *
   * @see PersonBasisDokument#ehrenaemterKommasepariert
   */
  @Deprecated
  @DocumentSimpleField("Ehrenaemter")
  public final String ehrenaemter;

  @DocumentSimpleField("IstZugelassen")
  public final boolean zugelassen;

  @DocumentSimpleField("IstZulassungVorZulassungsausschussVerloren")
  public final boolean istZulassungVorZulassungsausschussVerloren;

  @DocumentSimpleField("IstZulassungNachZulassungsausschussVerloren")
  public final boolean istZulassungNachZulassungsausschussVerloren;

  @DocumentSimpleField("IstAmtshindernisVorhanden")
  public final boolean amtshindernisVorhanden; // ELECTKOM-1022

  @DocumentSimpleField("IstAmtsannahmeVerweigert")
  public final boolean amtsannahmeVerweigert; // ELECTKOM-1063

  @DocumentSimpleField("IstAufStimmzettel")
  public final boolean istAufStimzettel;

  @DocumentSimpleField("Zulassungsstatus")
  public final String zulassungsStatus;

  @DocumentSimpleField("ZulassungsstatusBemerkung")
  public final String zulassungsStatusBemerkung;

  @DocumentSimpleField("KandidaturQuelle")
  public final String kandidaturQuelle;

  @DocumentSimpleField("ZugelassenOderZulassungErlaubt")
  public final boolean zugelassenOderZulassungErlaubt;

  @DocumentSimpleField("CustomData")
  public final Object customData;

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

  @DocumentSimpleField("Stimmzettel-Namen-Formatiert")
  public final String nameAufStimmzettelFormatted;

  @DocumentSimpleField("Stimmzettel-Nachname-Formatiert")
  public final String nachnameAufStimmzettelFormatted;

  @DocumentSimpleField("Stimmzettel-Vornamen-Formatiert")
  public final String vornamenAufStimmzettelFormatted;

  @DocumentSimpleField("Stimmzettel-Pseudonyme-Formatiert")
  public final String pseudonymeAufStimmzettelFormatted;

  @DocumentSimpleField("Stimmzettel-Infotext-Formatiert")
  public final String infotextAufStimmzettelFormatted;

  /**
   * @deprecated
   *
   * @see KandidaturDokument#nameAufStimmzettelFormatted
   * @see KandidaturDokument#pseudonymeAufStimmzettelFormatted
   */
  @Deprecated
  @DocumentSimpleField("Stimmzettel-Namen")
  public final String nameAufStimmzettel;

  /**
   * @deprecated
   *
   * @see KandidaturDokument#infotextAufStimmzettelFormatted
   * @see PersonBasisDokument#akademischeGradeKommasepariert
   */
  @Deprecated
  @DocumentSimpleField("Stimmzettel-Akademische-Grade")
  public final String akademischerGradAufStimmzettel;

  /**
   * @deprecated
   *
   * @see KandidaturDokument#infotextAufStimmzettelFormatted
   * @see PersonBasisDokument#ehrenaemterKommasepariert
   */
  @Deprecated
  @DocumentSimpleField("Stimmzettel-Ehrenaemter")
  public final String ehrenaemterAufStimmzettel;

  /**
   * @deprecated
   *
   * @see KandidaturDokument#infotextAufStimmzettelFormatted
   * @see PersonBasisDokument#berufeKommasepariert
   */
  @Deprecated
  @DocumentSimpleField("Stimmzettel-Berufe")
  public final String berufAufStimmzettel;

  protected KandidaturDokument() {
    super();

    this.ehrenaemter = "";

    this.istAufStimzettel = false;

    this.zugelassen = false;
    this.zugelassenOderZulassungErlaubt = false;

    this.zulassungsStatus = "";
    this.zulassungsStatusBemerkung = "";

    this.istZulassungVorZulassungsausschussVerloren = false;
    this.istZulassungNachZulassungsausschussVerloren = false;

    this.amtshindernisVorhanden = false;
    this.amtsannahmeVerweigert = false;

    this.kandidaturQuelle = "";

    this.wahlvorschlag = CoreWahlvorschlagsdatenDocument.EMPTY_OBJECT;

    this.customData = "";

    this.nameAufStimmzettelFormatted = "";
    this.nachnameAufStimmzettelFormatted = "";
    this.vornamenAufStimmzettelFormatted = "";
    this.pseudonymeAufStimmzettelFormatted = "";
    this.infotextAufStimmzettelFormatted = "";

    this.nameAufStimmzettel = "";
    this.akademischerGradAufStimmzettel = "";
    this.ehrenaemterAufStimmzettel = "";
    this.berufAufStimmzettel = "";
  }

  public KandidaturDokument(CoreElectContext coreElectContext, CoreWahlvorschlagsdatenDocument wahlvorschlagsdatenDocument, KandidaturCoreDaten kandidaturCoreDaten, Kandidatur kandidatur) {
    super(coreElectContext, kandidatur);

    ZulassungPruefer zulassungPruefer = kandidaturCoreDaten.getZulassungPruefer();

    this.ehrenaemter = this.ehrenaemterKommasepariert;

    this.istAufStimzettel = kandidatur.isAufStimmzettel();

    this.zugelassen = kandidatur.isZugelassen();
    this.zugelassenOderZulassungErlaubt = zugelassen || zulassungPruefer.isZulassenErlaubt(kandidatur);

    KandidaturStatus kandidaturStatus = kandidatur.getKandidaturStatus();

    this.zulassungsStatus = coreElectContext.getMessage(kandidaturStatus);
    this.zulassungsStatusBemerkung = kandidatur.getBemerkung();

    this.istZulassungVorZulassungsausschussVerloren = kandidaturStatus.isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitBeimZulassungsausschuss();
    this.istZulassungNachZulassungsausschussVerloren = kandidaturStatus.isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitNachZulassungsausschuss();

    this.amtshindernisVorhanden = KandidaturStatus.ZUGELASSEN_NACHTRAEGLICH_AMTSHINDERNIS_VORHANDEN.equals(kandidaturStatus);
    this.amtsannahmeVerweigert = KandidaturStatus.ZUGELASSEN_NACHTRAEGLICH_AMTSANNAHME_VERWEIGERT.equals(kandidaturStatus);

    this.kandidaturQuelle = coreElectContext.getMessage(kandidatur.getKandidaturQuelle());

    this.wahlvorschlag = wahlvorschlagsdatenDocument;

    this.customData = kandidaturCoreDaten.getKandidaturCustomData(kandidatur);

    StimmzettelFormatter stimmzettelFormatter = coreElectContext.getStimmzettelFormatter();
    StimmzettelFormatterKandidaturFormatDarstellung kandidaturFormatDarstellung = kandidaturCoreDaten.getKandidaturFormatDarstellung(); // ELECT-9312

    if (kandidaturFormatDarstellung == null) {
      this.nameAufStimmzettelFormatted = stimmzettelFormatter.formatKandidaturNamen(kandidatur);
      this.vornamenAufStimmzettelFormatted = stimmzettelFormatter.formatKandidaturVornamen(kandidatur);
      this.nachnameAufStimmzettelFormatted = stimmzettelFormatter.formatKandidaturNachname(kandidatur);
      this.pseudonymeAufStimmzettelFormatted = stimmzettelFormatter.formatKandidaturPseudonyme(kandidatur);
      this.infotextAufStimmzettelFormatted = stimmzettelFormatter.formatKandidaturInfotext(kandidatur);
    } else {
      EntityAufStimmzettelDaten entityAufStimmzettelDaten = kandidaturCoreDaten.getEntityAufStimmzettelDaten();

      this.nameAufStimmzettelFormatted = kandidaturFormatDarstellung.getNamen(entityAufStimmzettelDaten, kandidatur);
      this.vornamenAufStimmzettelFormatted = kandidaturFormatDarstellung.getVornamen(entityAufStimmzettelDaten, kandidatur);
      this.nachnameAufStimmzettelFormatted = kandidaturFormatDarstellung.getNachname(entityAufStimmzettelDaten, kandidatur);
      this.pseudonymeAufStimmzettelFormatted = kandidaturFormatDarstellung.getPseudonyme(entityAufStimmzettelDaten, kandidatur);
      this.infotextAufStimmzettelFormatted = kandidaturFormatDarstellung.getInfotext(entityAufStimmzettelDaten, kandidatur);
    }

    this.nameAufStimmzettel = stimmzettelFormatter.getKandidaturNamePraesentation(kandidatur);
    this.akademischerGradAufStimmzettel = stimmzettelFormatter.getKandidaturAkademischeGrade(kandidatur);
    this.ehrenaemterAufStimmzettel = stimmzettelFormatter.getKandidaturEhrenaemter(kandidatur);
    this.berufAufStimmzettel = stimmzettelFormatter.getKandidaturBerufe(kandidatur);
  }

  @Override
  public boolean isEmptyObject() {
    return this == EMPTY_OBJECT;
  }
}
