
package de.ivu.elect.dokumente;

import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_BUNDESLAND_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_GEMEINDE_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_GEMEINDE_NUMMER;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_LANDKREIS_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_STICHWAHLDATUM;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLAUSSCHUSSBEZEICHNUNG;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_HAUSNUMMER;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_ORT;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_PLZ;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_STRASSE;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_GEBIETSNAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_HAUSNUMMER;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_ORT;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_PLZ;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_POSTFACH;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_STRASSE;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_EMAIL;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFAX;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFON;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_WAHLLEITER_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG_KURZ;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLKREIS_NAME;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLKREIS_NUMMER;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLPERIODE_BEGINN;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLPERIODE_ENDE;
import static de.ivu.elect.business.wahl.entity.WahlParameterWerte.DOKUMENT_PLATZHALTER_ZU_WAEHLENDES_GREMIUM;

import java.util.Locale;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.Document;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.konfiguration.entity.AbstractKonfigurationLoader;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.system.entity.SystemGebietsebene;
import de.ivu.elect.business.wahl.entity.AbstractWahlParameterLoader;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;

@Document(value = DokumentVorlageArt.CUSTOM_PARAMETER_SUB_TEMPLATE, isSubTemplate = true)
public class CustomParameterDokument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  private final SystemGebietsebene systemGebietsebene;

  @DocumentSimpleField("Wahlbehörde Gebietsname")
  public final String wahlbehoerdeGebietsname;

  @DocumentSimpleField("Wahlbehörde Behördenname")
  public final String wahlbehoerdeBehoerdenname;

  @DocumentSimpleField("Wahlbehörde Postanschrift Strasse")
  public final String wahlbehoerdePostanschriftStrasse;

  @DocumentSimpleField("Wahlbehörde Postanschrift Hausnummer")
  public final String wahlbehoerdePostanschriftHausnummer;

  @DocumentSimpleField("Wahlbehörde Postanschrift Postfach")
  public final String wahlbehoerdePostanschriftPostfach;

  @DocumentSimpleField("Wahlbehörde Postanschrift PLZ")
  public final String wahlbehoerdePostanschriftPlz;

  @DocumentSimpleField("Wahlbehörde Postanschrift Ort")
  public final String wahlbehoerdePostanschriftOrt;

  @DocumentSimpleField("Wahlbehörde Besucheranschrift Strasse")
  public final String wahlbehoerdeBesucheranschriftStrasse;

  @DocumentSimpleField("Wahlbehörde Besucheranschrift Hausnummer")
  public final String wahlbehoerdeBesucheranschriftHausnummer;

  @DocumentSimpleField("Wahlbehörde Besucheranschrift PLZ")
  public final String wahlbehoerdeBesucheranschriftPlz;

  @DocumentSimpleField("Wahlbehörde Besucheranschrift Ort")
  public final String wahlbehoerdeBesucheranschriftOrt;

  @DocumentSimpleField("Wahlbehörde Wahlleiter/in Name")
  public final String wahlbehoerdeWahlleiterinName;

  @DocumentSimpleField("Wahlbehörde Sachbearbeiter/in Name")
  public final String wahlbehoerdeSachbearbeiterinName;

  @DocumentSimpleField("Wahlbehörde Sachbearbeiter/in Telefon")
  public final String wahlbehoerdeSachbearbeiterinTelefon;

  @DocumentSimpleField("Wahlbehörde Sachbearbeiter/in Telefax")
  public final String wahlbehoerdeSachbearbeiterinTelefax;

  @DocumentSimpleField("Wahlbehörde Sachbearbeiter/in Email")
  public final String wahlbehoerdeSachbearbeiterinEmail;

  @DocumentSimpleField("Bundesland Name")
  public final String bundeslandName;

  @DocumentSimpleField("Landkreis Name")
  public final String landkreisName;

  @DocumentSimpleField("Wahlkreis Name")
  public final String wahlkreisName;

  @DocumentSimpleField("Wahlkreis Nummer")
  public final String wahlkreisNummer;

  @DocumentSimpleField("Gemeinde Name")
  public final String gemeindeName;

  @DocumentSimpleField("Gemeinde Nummer")
  public final String gemeindeNummer;

  @DocumentSimpleField("Wahlbezeichnung (lang)")
  public final String wahlbezeichnung;

  @DocumentSimpleField("Wahlbezeichnung (kurz)")
  public final String wahlbezeichnungKurz;

  @DocumentSimpleField("Wahlausschussbezeichnung")
  public final String wahlauschussbezeichnung;

  @DocumentSimpleField("Zu wählendes Gremium")
  public final String zuWaehlendesGremium;

  @DocumentSimpleField("Datum mögliche Stichwahl")
  public final String stichwahldatum;

  @DocumentSimpleField("Wahlperiode (Beginn)")
  public final String wahlperiodeBeginn;

  @DocumentSimpleField("Wahlperiode (Ende)")
  public final String wahlperiodeEnde;

  public CustomParameterDokument(WahlOderWahltermin wahlOderWahltermin, Mandant mandant, Locale locale, AbstractKonfigurationLoader konfigurationLoader,
      AbstractWahlParameterLoader wahlParameterLoader) {
    super();

    this.systemGebietsebene = resolveSystemGebietsebene(konfigurationLoader, mandant);

    this.wahlbehoerdeGebietsname = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_GEBIETSNAME);

    this.wahlbehoerdeBehoerdenname = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_NAME);

    this.wahlbehoerdePostanschriftStrasse = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_STRASSE);
    this.wahlbehoerdePostanschriftHausnummer = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_HAUSNUMMER);
    this.wahlbehoerdePostanschriftPostfach = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_POSTFACH);
    this.wahlbehoerdePostanschriftPlz = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_PLZ);
    this.wahlbehoerdePostanschriftOrt = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_ORT);

    this.wahlbehoerdeBesucheranschriftStrasse = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_STRASSE);
    this.wahlbehoerdeBesucheranschriftHausnummer = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_HAUSNUMMER);
    this.wahlbehoerdeBesucheranschriftPlz = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_PLZ);
    this.wahlbehoerdeBesucheranschriftOrt = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_ORT);

    this.wahlbehoerdeWahlleiterinName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_WAHLLEITER_NAME);
    this.wahlbehoerdeSachbearbeiterinName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_NAME);
    this.wahlbehoerdeSachbearbeiterinTelefon = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFON);
    this.wahlbehoerdeSachbearbeiterinTelefax = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFAX);
    this.wahlbehoerdeSachbearbeiterinEmail = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_EMAIL);

    this.bundeslandName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_BUNDESLAND_NAME);

    this.landkreisName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_LANDKREIS_NAME);

    this.wahlkreisName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLKREIS_NAME);
    this.wahlkreisNummer = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLKREIS_NUMMER);

    this.gemeindeName = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_GEMEINDE_NAME);
    this.gemeindeNummer = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_GEMEINDE_NUMMER);

    this.wahlbezeichnung = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG);
    this.wahlbezeichnungKurz = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG_KURZ);

    this.wahlauschussbezeichnung = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLAUSSCHUSSBEZEICHNUNG);

    this.zuWaehlendesGremium = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_ZU_WAEHLENDES_GREMIUM);

    this.stichwahldatum = DokumentFormatter.formatDateMedium(wahlParameterLoader.resolveDateValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_STICHWAHLDATUM), locale);

    this.wahlperiodeBeginn = DokumentFormatter.formatDateMedium(wahlParameterLoader.resolveDateValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLPERIODE_BEGINN), locale);
    this.wahlperiodeEnde = DokumentFormatter.formatDateMedium(wahlParameterLoader.resolveDateValue(wahlOderWahltermin, DOKUMENT_PLATZHALTER_WAHLPERIODE_ENDE), locale);
  }

  public SystemGebietsebene getSystemGebietsebene() {
    return systemGebietsebene;
  }

  private SystemGebietsebene resolveSystemGebietsebene(AbstractKonfigurationLoader konfigurationLoader, Mandant mandant) {
    try {
      return mandant.getSystemGebietsebene();
    } catch (Exception ignored) {
    }

    return SystemGebietsebene.UNBEKANNT;
  }
}
