
package de.ivu.elect.business.wahl.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.function.BiFunction;

import de.ivu.elect.business.exchange.control.ContextMitCustomParameter;
import de.ivu.elect.jee.faces.Messages;

public enum NlWahlParameterWerte {

  WAHLBEHOERDE_WAHLLEITER_NAME(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_WAHLLEITER_NAME, "entity.einzahl.WAHL.WAHLBEHOERDE_WAHLLEITER_NAME", String.class),
  WAHLBEHOERDE_ANSCHRIFT_STRASSE_HAUSNUMMER(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_STRASSE, "entity.einzahl.WAHL.WAHLBEHOERDE_ANSCHRIFT_STRASSE_HAUSNUMMER", String.class),
  WAHLBEHOERDE_ANSCHRIFT_ORT(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_ORT, "entity.einzahl.WAHL.WAHLBEHOERDE_ANSCHRIFT_ORT", String.class),
  WAHLBEHOERDE_ANSCHRIFT_PLZ(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_PLZ, "entity.einzahl.WAHL.WAHLBEHOERDE_ANSCHRIFT_PLZ", String.class),

  WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_STRASSE_HAUSNUMMER("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_STRASSE_HAUSNUMMER", String.class) { // ELECT-11984

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlbehoerdeDokumentErstelltAnschriftStrasseHausnummer(value);
    }
  },
  WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_ORT("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_ORT", String.class) { // ELECT-11984

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlbehoerdeDokumentErstelltAnschriftOrt();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlbehoerdeDokumentErstelltAnschriftOrt(value);
    }
  },
  WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_PLZ("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_ANSCHRIFT_PLZ", String.class) { // ELECT-11984

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlbehoerdeDokumentErstelltAnschriftPlz();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlbehoerdeDokumentErstelltAnschriftPlz(value);
    }
  },
  WAHLBEHOERDE_DOKUMENT_ERSTELLT_AM("entity.einzahl.WAHL.WAHLBEHOERDE_DOKUMENT_ERSTELLT_AM", Date.class) { // ELECT-11849

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlbehoerdeDokumentErstelltAm();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlbehoerdeDokumentErstelltAm(value);
    }
  },

  GEWAEHLTES_GREMIUM_DURCHFUEHRENDES_ORGAN(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_GEBIETSNAME, "entity.einzahl.WAHL.GEWAEHLTES_GREMIUM_DURCHFUEHRENDES_ORGAN", String.class) { // ELECT-12872

    @Override
    public boolean isDefaultRequired() {
      return false;
    }
  },
  GEWAEHLTES_GREMIUM_NAME(WahlParameterWerte.DOKUMENT_PLATZHALTER_ZU_WAEHLENDES_GREMIUM, "entity.einzahl.WAHL.GEWAEHLTES_GREMIUM", String.class),
  GEWAEHLTES_GREMIUM_ANSCHRIFT_STRASSE_HAUSNUMMER(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_STRASSE, "entity.einzahl.WAHL.GEWAEHLTES_GREMIUM_ANSCHRIFT_STRASSE_HAUSNUMMER",
      String.class),
  GEWAEHLTES_GREMIUM_ANSCHRIFT_ORT(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_ORT, "entity.einzahl.WAHL.GEWAEHLTES_GREMIUM_ANSCHRIFT_ORT", String.class),
  GEWAEHLTES_GREMIUM_ANSCHRIFT_PLZ(WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_PLZ, "entity.einzahl.WAHL.GEWAEHLTES_GREMIUM_ANSCHRIFT_PLZ", String.class),

  WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN", Date.class) { // ELECT-15281

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungZuvorBeginn();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungZuvorBeginn(value);
    }
  },

  WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_STRASSE_HAUSNUMMER("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_STRASSE_HAUSNUMMER", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungAnschriftStrasseHausnummer();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungAnschriftStrasseHausnummer(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_ORT("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_ORT", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungAnschriftOrt();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungAnschriftOrt(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_PLZ("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ANSCHRIFT_PLZ", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungAnschriftPlz();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungAnschriftPlz(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_BEGINN("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_BEGINN", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungBeginn();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungBeginn(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_ENDE("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ENDE", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungEnde();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungEnde(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_FEHLER_VERMUTET("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_FEHLER_VERMUTET", String.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public int getDefaultMaxLength() {
      return 2048;
    }

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungFehlerVermutet();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungFehlerVermutet(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_EINWAENDE("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_EINWAENDE", String.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public int getDefaultMaxLength() {
      return 2048;
    }

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungEinwaende();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungEinwaende(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_EINWAENDE_BEMERKUNGEN("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_EINWAENDE_BEMERKUNGEN", String.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public int getDefaultMaxLength() {
      return 2048;
    }

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungBemerkungen();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungBemerkungen(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_NAME("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_NAME", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungUnterzeichner1Name();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungUnterzeichner1Name(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_ROLLE("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_1_ROLLE", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungUnterzeichner1Rolle();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungUnterzeichner1Rolle(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_NAME("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_NAME", String.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungUnterzeichner2Name();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungUnterzeichner2Name(value);
    }
  },
  WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_ROLLE("entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_UNTERZEICHNER_2_ROLLE", String.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlausschusssitzungUnterzeichner2Rolle();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlausschusssitzungUnterzeichner2Rolle(value);
    }
  },

  FRIST_ZULETZT_GESETZT_BEGINN("entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_BEGINN", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getFristZuletztGesetztBeginn();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setFristZuletztGesetztBeginn(value);
    }
  },
  FRIST_ZULETZT_GESETZT_ENDE("entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_ENDE", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getFristZuletztGesetztEnde();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setFristZuletztGesetztEnde(value);
    }
  },

  WAHLVORSCHLAG_EINREICHUNG_ABGABEFRIST("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_ABGABEFRIST", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      Date result = wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagEinreichungAbgabefrist();

      if (result == null) {
        result = NlWahlart.getNominationDate(wahl); // ELECT-10119
      }

      return result;
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagEinreichungAbgabefrist(value);
    }
  },
  WAHLVORSCHLAG_EINREICHUNG_ANSCHRIFT_ORT("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_ANSCHRIFT_ORT", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagEinreichungAnschriftOrt();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagEinreichungAnschriftOrt(value);
    }
  },
  WAHLVORSCHLAG_EINREICHUNG_UNTERZEICHNER_1_NAME("entity.einzahl.WAHL.WAHLVORSCHLAG_EINREICHUNG_UNTERZEICHNER_1_NAME", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagEinreichungUnterzeichner1Name();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagEinreichungUnterzeichner1Name(value);
    }
  },

  WAHLVORSCHLAG_VEROEFFENTLICHUNG_BEGINN("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_BEGINN", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagVeroeffentlichungBeginn();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagVeroeffentlichungBeginn(value);
    }
  },
  WAHLVORSCHLAG_VEROEFFENTLICHUNG_ANSCHRIFT_ORT("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_ANSCHRIFT_ORT", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagVeroeffentlichungAnschriftOrt();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagVeroeffentlichungAnschriftOrt(value);
    }
  },
  WAHLVORSCHLAG_VEROEFFENTLICHUNG_UNTERZEICHNER_1_NAME("entity.einzahl.WAHL.WAHLVORSCHLAG_VEROEFFENTLICHUNG_UNTERZEICHNER_1_NAME", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getWahlvorschlagVeroeffentlichungUnterzeichner1Name();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setWahlvorschlagVeroeffentlichungUnterzeichner1Name(value);
    }
  },

  EINWOHNERZAHL_VEROEFFENTLICHUNG_ID("entity.einzahl.WAHL.EINWOHNERZAHL_VEROEFFENTLICHUNG_ID", String.class) {

    @Override
    public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getEinwohnerzahlVeroeffentlichungId();
    }

    @Override
    public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
      wahl.getCustomData(NlWahlCustomData.class).setEinwohnerzahlVeroeffentlichungId(value);
    }
  },
  EINWOHNERZAHL_VEROEFFENTLICHUNG_DATUM("entity.einzahl.WAHL.EINWOHNERZAHL_VEROEFFENTLICHUNG_DATUM", Date.class) {

    @Override
    public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return wahl.getCustomData(NlWahlCustomData.class).getEinwohnerzahlVeroeffentlichungDatum();
    }

    @Override
    public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
      wahl.getCustomData(NlWahlCustomData.class).setEinwohnerzahlVeroeffentlichungDatum(value);
    }
  },

  KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_WAEHLER_VORHANDEN("entity.einzahl.WAHL.KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_WAEHLER_VORHANDEN", Boolean.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public Boolean getBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return Boolean.TRUE.equals(getContextValue(context)); // Transienter Wert -> standardmäßig false...
    }

    @Override
    public void setBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Boolean value) {
      setContextValue(context, value); // Transienter Wert -> nicht an Wahl/als Wahlparameter speichern...
    }
  },
  KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_STIMMZETTEL_VORHANDEN("entity.einzahl.WAHL.KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_STIMMZETTEL_VORHANDEN", Boolean.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public Boolean getBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return Boolean.TRUE.equals(getContextValue(context)); // Transienter Wert -> standardmäßig false...
    }

    @Override
    public void setBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Boolean value) {
      setContextValue(context, value); // Transienter Wert -> nicht an Wahl/als Wahlparameter speichern...
    }
  },
  KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_STIMMZETTEL_ABWEICHEND_VORHANDEN("entity.einzahl.WAHL.KORREKTUREN_STIMMEINGABEN_KOPFZAHLEN_STIMMZETTEL_ABWEICHEND_VORHANDEN", Boolean.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public Boolean getBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      return Boolean.TRUE.equals(getContextValue(context)); // Transienter Wert -> standardmäßig false...
    }

    @Override
    public void setBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Boolean value) {
      setContextValue(context, value); // Transienter Wert -> nicht an Wahl/als Wahlparameter speichern...
    }
  },
  KORREKTUREN_STIMMEINGABEN_STIMMEN_LISTEN_IDS("entity.einzahl.WAHL.KORREKTUREN_STIMMEINGABEN_STIMMEN_LISTEN_IDS", List.class) {

    @Override
    public boolean isDefaultRequired() {
      return false;
    }

    @Override
    public <T> List<T> getListValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
      // Transienter Wert -> standardmäßig leer...
      Object value = getContextValue(context);

      if (value instanceof List) {
        return (List<T>) value;
      }

      return new ArrayList<>();
    }

    @Override
    public <T> void setListValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, List<T> values) {
      setContextValue(context, values); // Transienter Wert -> nicht an Wahl/als Wahlparameter speichern...
    }
  },

  ;

  public static final int MAX_LENGTH_DEFAULT_VALUE = 1024;

  public static final String WAHLAUSSCHUSSSITZUNG_BEGINN_ENDE_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_BEGINN_ENDE";

  public static final String WAHLAUSSCHUSSSITZUNG_BEGINN_DATUM_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_BEGINN_DATUM";

  public static final String WAHLAUSSCHUSSSITZUNG_BEGINN_UHRZEIT_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_BEGINN_UHRZEIT";

  public static final String WAHLAUSSCHUSSSITZUNG_ENDE_DATUM_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ENDE_DATUM";

  public static final String WAHLAUSSCHUSSSITZUNG_ENDE_UHRZEIT_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ENDE_UHRZEIT";

  public static final String WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_ENDE_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_ENDE";

  public static final String WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_DATUM_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_DATUM";

  public static final String WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_UHRZEIT_LABEL_MSG_KEY = "entity.einzahl.WAHL.WAHLAUSSCHUSSSITZUNG_ZUVOR_BEGINN_UHRZEIT";

  public static final String FRIST_ZULETZT_GESETZT_BEGINN_ENDE_LABEL_MSG_KEY = "entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_BEGINN_ENDE";

  public static final String FRIST_ZULETZT_GESETZT_BEGINN_DATUM_LABEL_MSG_KEY = "entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_BEGINN_DATUM";

  public static final String FRIST_ZULETZT_GESETZT_BEGINN_UHRZEIT_LABEL_MSG_KEY = "entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_BEGINN_UHRZEIT";

  public static final String FRIST_ZULETZT_GESETZT_ENDE_DATUM_LABEL_MSG_KEY = "entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_ENDE_DATUM";

  public static final String FRIST_ZULETZT_GESETZT_ENDE_UHRZEIT_LABEL_MSG_KEY = "entity.einzahl.WAHL.FRIST_ZULETZT_GESETZT_ENDE_UHRZEIT";

  private final WahlParameterWerte wahlParameterWerte;

  private final String labelMsgKey;

  private Class< ? > valueClass;

  NlWahlParameterWerte(String labelMsgKey, Class< ? > valueClass) {
    this(null, labelMsgKey, valueClass);
  }

  NlWahlParameterWerte(WahlParameterWerte wahlParameterWerte, String labelMsgKey, Class< ? > valueClass) {
    this.wahlParameterWerte = wahlParameterWerte;

    this.labelMsgKey = labelMsgKey;

    this.valueClass = valueClass;
  }

  public boolean isWahlParameter() {
    return getWahlParameterWerte() != null;
  }

  public WahlParameterWerte getWahlParameterWerte() {
    return wahlParameterWerte;
  }

  public Object getValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
    if (containsStringValue()) {
      return getStringValue(context, wahl, wahlParameterLoader);
    }

    if (containsDateValue()) {
      return getDateValue(context, wahl, wahlParameterLoader);
    }

    if (containsBooleanValue()) {
      return getBooleanValue(context, wahl, wahlParameterLoader);
    }

    if (containsListValue()) {
      return getListValue(context, wahl, wahlParameterLoader);
    }

    return null;
  }

  public void setValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Object object) {
    if (containsStringValue()) {
      setStringValue(context, wahl, wahlParameterLoader, (String) object);
    } else if (containsDateValue()) {
      setDateValue(context, wahl, wahlParameterLoader, (Date) object);
    } else if (containsBooleanValue()) {
      setBooleanValue(context, wahl, wahlParameterLoader, (Boolean) object);
    } else if (containsListValue()) {
      setListValue(context, wahl, wahlParameterLoader, (List< ? >) object);
    }
  }

  public boolean containsStringValue() {
    return Objects.equals(valueClass, String.class);
  }

  public String getStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
    return getWahlParameterValue(wahl, wahlParameterLoader::resolveStringValue);
  }

  public void setStringValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, String value) {
    setWahlParameterValue(wahl, wahlParameterLoader, value);
  }

  public boolean containsDateValue() {
    return Objects.equals(valueClass, Date.class);
  }

  public Date getDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
    return getWahlParameterValue(wahl, wahlParameterLoader::resolveDateValue);
  }

  public void setDateValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Date value) {
    setWahlParameterValue(wahl, wahlParameterLoader, value);
  }

  public boolean containsBooleanValue() {
    return Objects.equals(valueClass, Boolean.class);
  }

  public Boolean getBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
    return getWahlParameterValue(wahl, wahlParameterLoader::resolveBooleanValue);
  }

  public void setBooleanValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Boolean value) {
    setWahlParameterValue(wahl, wahlParameterLoader, value);
  }

  public boolean containsListValue() {
    return Objects.equals(valueClass, List.class);
  }

  public <T> List<T> getListValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader) {
    throw new IllegalStateException("WahlParameterWerte für List<?> NICHT unterstützt -> Methode überschreiben [parameter = " + name() + "]!");
  }

  public <T> void setListValue(ContextMitCustomParameter context, Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, List<T> value) {
    throw new IllegalStateException("WahlParameterWerte für List<?> NICHT unterstützt -> Methode überschreiben [parameter = " + name() + "]!");
  }

  protected <T> T getWahlParameterValue(Wahl wahl, BiFunction<Wahl, WahlParameterWerte, T> valueGetter) {
    if (!isWahlParameter()) {
      throw new IllegalStateException("WahlParameterWerte NICHT gesetzt [parameter = " + name() + "]!");
    }

    return valueGetter.apply(wahl, getWahlParameterWerte());
  }

  protected void setWahlParameterValue(Wahl wahl, AbstractWahlParameterLoader wahlParameterLoader, Object value) {
    if (!isWahlParameter()) {
      throw new IllegalStateException("WahlParameterWerte NICHT gesetzt [parameter = " + name() + "]!");
    }

    WahlParameter wahlParameter = wahlParameterLoader.getParameter(wahl, getWahlParameterWerte());

    if (wahlParameter != null) {
      wahlParameter.setWert(value == null ? null : value.toString());
    }
  }

  protected Object getContextValue(ContextMitCustomParameter context) {
    return context.getContextParameters().get("NlWahlParameterWerte@" + name());
  }

  protected void setContextValue(ContextMitCustomParameter context, Object value) {
    context.getContextParameters().put("NlWahlParameterWerte@" + name(), value); // Transienter Wert -> nicht an Wahl/als Wahlparameter speichern...
  }

  public String getDefaultLabel(Messages messages, Object... params) {
    return messages.getMessageForMessageKey(getDefaultLabelMsgKey(), params);
  }

  public String getDefaultLabelMsgKey() {
    return labelMsgKey;
  }

  public boolean isDefaultRequired() {
    return true;
  }

  public int getDefaultMinLength() {
    return 0;
  }

  public int getDefaultMaxLength() {
    return MAX_LENGTH_DEFAULT_VALUE;
  }
}
