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

import de.ivu.elect.business.datei.entity.CsvAnfuehrungszeichen;
import de.ivu.elect.business.datei.entity.CsvTrennzeichen;
import de.ivu.elect.business.datei.entity.CsvZeichensatz;
import de.ivu.elect.business.dokumente.control.DokumentvorlageKonfigurationValuesSupplier;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.ergebnis.entity.ErgebnisberechnungStatus;
import de.ivu.elect.business.gebietsbaum.control.GebietsartenDerAusgewaehltenWahlValuesSupplier;
import de.ivu.elect.business.gebietsbaum.entity.PruefzifferAutomatischGenerierenFormat;
import de.ivu.elect.business.internet.control.InternetPreasentationUploadServiceTypValidator;
import de.ivu.elect.business.kandidatenportal.entity.ZugriffscodePruefung;
import de.ivu.elect.business.konfiguration.entity.*;
import de.ivu.elect.business.praesentation.entity.*;
import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeHerkunftUmgang;
import de.ivu.elect.business.stimmeingabe.entity.StimmenLadenArt;
import de.ivu.elect.business.wahllokalsystem.entity.WahllokalsystenWahlbeteiligungUebernehmenBriefwahl;
import de.ivu.elect.jee.faces.UrlStringValidator;

import javax.annotation.Nullable;
import javax.faces.validator.LongRangeValidator;
import javax.faces.validator.Validator;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import static de.ivu.elect.business.dokumente.entity.DokumentVorlageArt.*;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.PERSONENREGISTER;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.STIMMEINGABE;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterKategorie.*;
import static de.ivu.elect.business.konfiguration.entity.CustomParameterWertTyp.*;
import static de.ivu.elect.business.security.Customer.WES;
import static de.ivu.elect.business.security.Customer.*;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;

// Cf. de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte!
public enum WahlParameterWerte implements CustomParameterTemplate {

  WAEHLERVERZEICHNIS_WAHLBERECHTIGUNGSPRUEFUNG_DETAIL_LOG(WAEHLERVERZEICHNIS, BOOLEAN, WVZ),

  WAEHLERVERZEICHNIS_ERSTELLUNG_STICHTAG(WAEHLERVERZEICHNIS, TIMESTAMP, WVZ),

  // Wählerverzeichniseintragsdokument
  DOKUMENTVORLAGE_ANSCHREIBEN_STREICHUNG(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAEHLERVERZEICHNIS_EINTRAG)), Function::identity,
      WVZ),
  DOKUMENTVORLAGE_ANSCHREIBEN_TEILSTREICHUNG(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAEHLERVERZEICHNIS_EINTRAG)), Function::identity,
      WVZ),
  DOKUMENTVORLAGE_ANSCHREIBEN_ABWEICHENDE_VERSANDANSCHRIFT(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAEHLERVERZEICHNIS_EINTRAG)),
      Function::identity, WVZ),
  DOKUMENTVORLAGE_ANSCHREIBEN_ERFASSUNG_AUSLANDSDEUTSCHER(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAHLSCHEINANTRAG)),
      Function::identity, WVZ),
  DOKUMENTVORLAGE_ANSCHREIBEN_GEMEINDE_HAUPTWOHNUNG(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAEHLERVERZEICHNIS_EINTRAG)),
      Function::identity, WVZ),
  DOKUMENTVORLAGE_ANSCHREIBEN_GEMEINDE_ZUZUGSWOHNUNG(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAEHLERVERZEICHNIS_EINTRAG)),
      Function::identity, WVZ),
  //ELECT-5385
  DOKUMENTVORLAGE_WAHLBENACHRICHTIGUNG(WAEHLERVERZEICHNIS_EINTRAG_DOKUMENT, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(WAHLBENACHRICHTIGUNG)), Function::identity, WVZ),

  UMGANG_AWERTE_HINTERLEGT(STIMMEINGABE, ENUM, UmgangHinterlegteAWerte.class, WAS),

  // Wahlbenachrichtigung
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_CRONTAB(WAHLBENACHRICHTIGUNG_IMPORT, CRONTAB, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_IMPORT_VERZEICHNIS(WAHLBENACHRICHTIGUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_ERFOLGREICH_VERZEICHNIS(WAHLBENACHRICHTIGUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_FEHLER_VERZEICHNIS(WAHLBENACHRICHTIGUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_CSV_ZEICHENSATZ(WAHLBENACHRICHTIGUNG_IMPORT, ENUM, CsvZeichensatz.class, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_CSV_ANZAHL_KOPFZEILEN(WAHLBENACHRICHTIGUNG_IMPORT, LONG, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_CSV_TRENNZEICHEN(WAHLBENACHRICHTIGUNG_IMPORT, ENUM, CsvTrennzeichen.class, WVZ),
  WAHLBENACHRICHTIGUNG_IMPORT_UNZUSTELLBAR_CSV_ANFUEHRUNGSZEICHEN(WAHLBENACHRICHTIGUNG_IMPORT, ENUM, CsvAnfuehrungszeichen.class, WVZ),

  // Wird auf der Wahlbenachrichtigung gedruckt/exportiert.
  WAHLSCHEINANTRAG_ONLINE_FORMULAR_URL_MUC(WAHLBENACHRICHTIGUNG_EXPORT, STRING, singletonList(new UrlStringValidator()), MUC_WVZ),
  WAHLSCHEINANTRAG_ONLINE_FORMULAR_URL_ZEICHENSATZ_MUC(WAHLBENACHRICHTIGUNG_EXPORT, ENUM, CsvZeichensatz.class, MUC_WVZ),

  WAHLBENACHRICHTIGUNG_EXPORT_VERZEICHNIS(WAHLBENACHRICHTIGUNG_EXPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLBENACHRICHTIGUNG_EXPORT_STATUS_FILTER(WAHLBENACHRICHTIGUNG_EXPORT, ENUM, WahlParameterWahlbenachrichtigungStatus.class, WVZ),
  WAHLBENACHRICHTIGUNG_EXPORT_STATUS_NACH_EXPORT(WAHLBENACHRICHTIGUNG_EXPORT, ENUM, WahlParameterWahlbenachrichtigungStatus.class, WVZ),
  WAHLBENACHRICHTIGUNG_EXPORT_DATEI_AUFTEILUNG(WAHLBENACHRICHTIGUNG_EXPORT, STRING_MULTILINE, WVZ),

  //Wählerverzeichnisexport
  WAEHLERVERZEICHNIS_EXPORT_VERZEICHNIS(WAEHLERVERZEICHNIS_EXPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),

  // Wahlscheine
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_CRONTAB(WAHLSCHEIN_IMPORT, CRONTAB, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_IMPORT_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_ERFOLGREICH_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_FEHLER_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_CSV_ZEICHENSATZ(WAHLSCHEIN_IMPORT, ENUM, CsvZeichensatz.class, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_CSV_ANZAHL_KOPFZEILEN(WAHLSCHEIN_IMPORT, LONG, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_CSV_TRENNZEICHEN(WAHLSCHEIN_IMPORT, ENUM, CsvTrennzeichen.class, WVZ),
  WAHLSCHEIN_IMPORT_VERSANDBESTAETIGUNG_CSV_ANFUEHRUNGSZEICHEN(WAHLSCHEIN_IMPORT, ENUM, CsvAnfuehrungszeichen.class, WVZ),

  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_CRONTAB(WAHLSCHEIN_IMPORT, CRONTAB, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_IMPORT_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_ERFOLGREICH_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_FEHLER_VERZEICHNIS(WAHLSCHEIN_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_CSV_ZEICHENSATZ(WAHLSCHEIN_IMPORT, ENUM, CsvZeichensatz.class, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_CSV_ANZAHL_KOPFZEILEN(WAHLSCHEIN_IMPORT, LONG, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_CSV_TRENNZEICHEN(WAHLSCHEIN_IMPORT, ENUM, CsvTrennzeichen.class, WVZ),
  WAHLSCHEIN_IMPORT_UNZUSTELLBAR_CSV_ANFUEHRUNGSZEICHEN(WAHLSCHEIN_IMPORT, ENUM, CsvAnfuehrungszeichen.class, WVZ),

  WAHLSCHEIN_EXPORT_CRONTAB(WAHLSCHEIN_EXPORT, CRONTAB, WVZ),
  WAHLSCHEIN_EXPORT_VERZEICHNIS(WAHLSCHEIN_EXPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEIN_EXPORT_BARCODE_DATEN(WAHLSCHEIN_EXPORT, ENUM, WahlscheinBarcodeDaten.class, WVZ), // ELECTMUC-3003
  WAHLSCHEIN_EXPORT_STATUS_FILTER(WAHLSCHEIN_EXPORT, ENUM, WahlParameterWahlscheinStatus.class, WVZ),
  WAHLSCHEIN_EXPORT_STATUS_NACH_EXPORT(WAHLSCHEIN_EXPORT, ENUM, WahlParameterWahlscheinStatus.class, WVZ),
  WAHLSCHEIN_EXPORT_DATEI_AUFTEILUNG(WAHLSCHEIN_EXPORT, STRING_MULTILINE, WVZ),

  // Wahlscheinanträge - online
  WAHLSCHEINANTRAG_IMPORT_ONLINE_CRONTAB(WAHLSCHEINANTRAG_IMPORT, CRONTAB, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_IMPORT_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_ERFOLGREICH_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_QUITTUNG_VERZEICHNIS_MUC(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, MUC_WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_FEHLER_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_CSV_ZEICHENSATZ(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvZeichensatz.class, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_CSV_ANZAHL_KOPFZEILEN(WAHLSCHEINANTRAG_IMPORT, LONG, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_CSV_TRENNZEICHEN(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvTrennzeichen.class, WVZ),
  WAHLSCHEINANTRAG_IMPORT_ONLINE_CSV_ANFUEHRUNGSZEICHEN(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvAnfuehrungszeichen.class, WVZ),

  // Wahlscheinanträge - postalisch
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_CRONTAB(WAHLSCHEINANTRAG_IMPORT, CRONTAB, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_IMPORT_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_ERFOLGREICH_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_FEHLER_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_CSV_ZEICHENSATZ(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvZeichensatz.class, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_CSV_ANZAHL_KOPFZEILEN(WAHLSCHEINANTRAG_IMPORT, LONG, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_CSV_TRENNZEICHEN(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvTrennzeichen.class, WVZ),
  WAHLSCHEINANTRAG_IMPORT_POSTALISCH_CSV_ANFUEHRUNGSZEICHEN(WAHLSCHEINANTRAG_IMPORT, ENUM, CsvAnfuehrungszeichen.class, WVZ),

  // Wahlscheinanträge - nicht auswertbar
  WAHLSCHEINANTRAG_IMPORT_NICHT_AUSWERTBAR_CRONTAB(WAHLSCHEINANTRAG_IMPORT, CRONTAB, WVZ),
  WAHLSCHEINANTRAG_IMPORT_NICHT_AUSWERTBAR_IMPORT_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_NICHT_AUSWERTBAR_ERFOLGREICH_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),
  WAHLSCHEINANTRAG_IMPORT_NICHT_AUSWERTBAR_FEHLER_VERZEICHNIS(WAHLSCHEINANTRAG_IMPORT, VERZEICHNIS_BESCHREIBBAR, WVZ),

  //
  WAEHLERVERZEICHNIS_ANZAHL_ZEILEN(WAEHLERVERZEICHNIS, LONG, singletonList(new LongRangeValidator(WahlParameterWerte.MAX_WAEHLERVERZEICHNIS_ANZAHL_ZEILEN, 0L)),
      WVZ),
  WAEHLERVERZEICHNIS_ANZAHL_ZUSAETZLICHE_SEITEN(WAEHLERVERZEICHNIS, LONG,
      singletonList(new LongRangeValidator(WahlParameterWerte.MAX_WAEHLERVERZEICHNIS_ANZAHL_ZUSAETZLICHE_SEITEN, 0L)), WVZ),
  WAEHLERVERZEICHNIS_GRUPPIERUNG(WAEHLERVERZEICHNIS, ENUM, WaehlerverzeichnisGruppierungWahlParameter.class, WVZ),

  // ELECTMUC-2698
  WAEHLERVERZEICHNIS_BRIEFWAHLBEZIRK_ZU_WAHLBEZIRK_ZUORDNUNG_EINDEUTIG(WAEHLERVERZEICHNIS, BOOLEAN, WVZ),

  WAEHLERVERZEICHNIS_AENDERUNGEN_UEBERNEHMEN_BIS_EINSTELLUNG(WAEHLERVERZEICHNIS, ENUM, WaehlerverzeichnisAenderungUebernehmenZeitpunktWahlParameter.class, WVZ),
  WAEHLERVERZEICHNIS_AENDERUNGEN_UEBERNEHMEN_BIS_MANUELLER_ZEITPUNKT(WAEHLERVERZEICHNIS, TIMESTAMP, WVZ),

  WAEHLERVERZEICHNIS_GEMEINDESCHLUESSEL_WAHLLOKAL(WAEHLERVERZEICHNIS, STRING, WVZ),
  WAEHLERVERZEICHNIS_LANDESNUMMER_WAHLLOKAL(WAEHLERVERZEICHNIS, STRING, WVZ),

  // Veranstaltungen ELECTMUC-1398
  VERANSTALTUNG_IMPORT_CRONTAB(VERANSTALTUNG_IMPORT, CRONTAB, MUC_WOS),
  VERANSTALTUNG_IMPORT_VERZEICHNIS(VERANSTALTUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, MUC_WOS),
  VERANSTALTUNG_IMPORT_ERFOLGREICH_VERZEICHNIS(VERANSTALTUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, MUC_WOS),
  VERANSTALTUNG_IMPORT_FEHLER_VERZEICHNIS(VERANSTALTUNG_IMPORT, VERZEICHNIS_BESCHREIBBAR, MUC_WOS),
  VERANSTALTUNG_IMPORT_CSV_ZEICHENSATZ(VERANSTALTUNG_IMPORT, ENUM, CsvZeichensatz.class, MUC_WOS),
  VERANSTALTUNG_IMPORT_CSV_ANZAHL_KOPFZEILEN(VERANSTALTUNG_IMPORT, LONG, MUC_WOS),
  VERANSTALTUNG_IMPORT_CSV_TRENNZEICHEN(VERANSTALTUNG_IMPORT, ENUM, CsvTrennzeichen.class, MUC_WOS),
  VERANSTALTUNG_IMPORT_CSV_ANFUEHRUNGSZEICHEN(VERANSTALTUNG_IMPORT, ENUM, CsvAnfuehrungszeichen.class, MUC_WOS),

  // ELECTMUC-1934, Rückmeldung der Anwesenheiten
  WAHLHELFEREINSATZ_AUFENTHALT_ERFASSUNG_EXTERN_GUELTIGKEIT_IN_STUNDEN_MAX(SONSTIGES, LONG, MUC_WOS),
  WAHLHELFEREINSATZ_AUFENTHALT_ERFASSUNG_EXTERN_UEBERNAHME_WAHLHELFEREINSATZ_STATUS_ANWESEND_TIMESTAMP_MIN(SONSTIGES, TIMESTAMP, MUC_WOS),

  WAHLEXPORT_CRONTAB(WAHL_EXPORT, CRONTAB, WOS, WAS),
  WAHLEXPORT_PFAD(WAHL_EXPORT, VERZEICHNIS_BESCHREIBBAR, WOS, WAS),

  // ELECTMUC-1082 Wahlvorschlagsdokument, cf. WahlvorschlagsdokumentArt
  WAHLVORSCHLAGSDOKUMENT_NACHWEIS_DER_ORGANISATION(WAHLVORSCHLAGSDOKUMENT, ENUM, WahlParameterWahlvorschlagsdokumentWahlvorschlagArt.class, WUS),
  WAHLVORSCHLAGSDOKUMENT_NIEDERSCHRIFT_AUFSTELLUNGSVERSAMMLUNG(WAHLVORSCHLAGSDOKUMENT, ENUM, WahlParameterWahlvorschlagsdokumentWahlvorschlagArt.class, WUS),
  WAHLVORSCHLAGSDOKUMENT_ERKLAERUNG_KANDIDATEN(WAHLVORSCHLAGSDOKUMENT, ENUM, WahlParameterWahlvorschlagsdokumentWahlvorschlagArt.class, WUS),
  WAHLVORSCHLAGSDOKUMENT_WAEHLBARKEITSBESTAETIGUNG(WAHLVORSCHLAGSDOKUMENT, ENUM, WahlParameterWahlvorschlagsdokumentWahlvorschlagArt.class, WUS),
  WAHLVORSCHLAGSDOKUMENT_BESCHEINIGUNG_NICHT_AUSSCHLUSS(WAHLVORSCHLAGSDOKUMENT, ENUM, WahlParameterWahlvorschlagsdokumentWahlvorschlagArt.class, WUS),

  STATISTIK_LAUF_CRONTAB(STATISTIK, CRONTAB, WVZ), // ertsmal nur WVZ

  // ELECTSL-23 Ergebnisdatei mit Präsentation exportieren
  // ErgebnisExportWidget nutzen(!)
  // PRAESENTATION_PFAD_FUER_AUTOMATISCHEN_ERGEBNIS_EXPORT(PRAESENTATION, VERZEICHNIS_BESCHREIBBAR, SL_WAS),

  PREASENTATIION_STATUS(PRAESENTATION, ENUM, PraesentationBereitstellen.class, WAS),
  PREASENTATIION_URL(PRAESENTATION, STRING, WAS), // Extern, vgl. ELECT-13321
  PREASENTATIION_ERFASSUNGSGEBIETE_PRO_WAHLGEBIET_NOTWENDIG(PRAESENTATION, LONG, WAS),
  PREASENTATIION_ERFASSUNGSGEBIETE_ZURUECKHALTEN(PRAESENTATION, ENUM, PraesentationErfassungsgebieteZurueckhalten.class, WAS),
  PREASENTATIION_AUTOMATISCHEN_EXPORT_ANSTOSSEN(PRAESENTATION, ENUM, PraesentationAutomatischenExportAnstossen.class, WAS),
  PREASENTATIION_ANZAHL_RENDER_THREADS(PRAESENTATION, LONG, singletonList(new LongRangeValidator(Constants.MAX_RENDER_THREADS, 1L)), WAS),
  PREASENTATIION_ASYNCHRONE_BEREITSTELLUNG_NOTWENDIG(PRAESENTATION, VOID, WAS),
  PREASENTATIION_INTERNET_SEITEN_AUS_DOKUMENTVORLAGE_VERWENDEN(PRAESENTATION, BOOLEAN, WAS), // ELECTKOM-996

  PREASENTATIION_UPLOAD_SERVICE_STATUS(PRAESENTATION, ENUM, PraesentationUploadServiceStatus.class, WAS),
  PREASENTATIION_UPLOAD_SERVICE_TYP(PRAESENTATION, ENUM, PraesentationUploadServiceTyp.class, null,
      singletonList(new InternetPreasentationUploadServiceTypValidator()), c -> false, WAS),
  PREASENTATIION_UPLOAD_SERVICE_URL(PRAESENTATION, STRING, WAS),
  PREASENTATIION_UPLOAD_SERVICE_BENUTZER(PRAESENTATION, STRING, WAS),
  PREASENTATIION_UPLOAD_SERVICE_PASSWORT(PRAESENTATION, STRING_SECRET, WAS),
  PREASENTATIION_UPLOAD_SERVICE_KONFIG(PRAESENTATION, VOID_SECRET, WAS),

  ERGEBNISBERECHNUNG_STATUS(SITZBERECHNUNG, ENUM, ErgebnisberechnungStatus.class, WAS),

  // ELECT-5568 Stimmeingaben automatisch importieren (externes Format)
  STIMMEINGABEN_CUSTOM_FORMAT_IMPORT_CRONTAB(STIMMEINGABE, CRONTAB, WAS),

  STIMMEINGABEN_CUSTOM_FORMAT_IMPORT_VERZEICHNIS(STIMMEINGABE, VERZEICHNIS_BESCHREIBBAR, WAS),
  STIMMEINGABEN_CUSTOM_FORMAT_IMPORT_ERFOLGREICH_VERZEICHNIS(STIMMEINGABE, VERZEICHNIS_BESCHREIBBAR, WAS),
  STIMMEINGABEN_CUSTOM_FORMAT_IMPORT_FEHLER_VERZEICHNIS(STIMMEINGABE, VERZEICHNIS_BESCHREIBBAR, WAS),

  // ELECT-11751
  LWL_WAHLEN_WEB_SERVICE_ERGEBNIS_DOWNLOAD_IMPORT_CRONTAB(STIMMEINGABE, CRONTAB, KOM_RP_WAS),
  LWL_WAHLEN_WEB_SERVICE_ERGEBNIS_DOWNLOAD_IMPORT_ACTIVE(STIMMEINGABE, BOOLEAN, KOM_RP_WAS),

  WAHLVORSCHLAG_REIHENFOLGE_BESTAETIGEN_NACH_SPEICHERN(SONSTIGES, BOOLEAN, CORE),

  // ELECTBB-112 Nach Ergebniseingang Schnellmeldung als Quittung bereitstellen
  @Deprecated // ELECT-6463
      STIMMEINGABEN_NIEDERSCHRIFT_EXPORT_DOKUMENTVORLAGE(STIMMEINGABE, SELECT,
      new DokumentvorlageKonfigurationValuesSupplier(singletonList(DokumentVorlageArt.STIMMEINGABE)), Function::identity, TEST),
  @Deprecated // ELECT-6463
  STIMMEINGABEN_NIEDERSCHRIFT_EXPORT_ACTIVE(STIMMEINGABE, BOOLEAN, TEST),

  STIMMEINGABE_PLAUSIBILISIERUNG_AKTIVIERT(STIMMEINGABE, BOOLEAN, WAS),
  STIMMEINGABE_HERKUNFT_SETZEN(STIMMEINGABE, ENUM, StimmeingabeHerkunftUmgang.class, KOM_BY_ALL_WAS, MUC_WAS),

  // ELECTKOM-749
  STIMMEINGABE_WAHLART_ERGEBNISART_VORLAEUFIG_ERFASSUNGSART(STIMMEINGABE, ENUM, WahlartErgebnisartVorlaeufigErfassungsart.class,
      WahlParameterWahlartErgebnisartVorlaeufigErfassungsartFilter.class, c -> false, MUC_WAS, KOM_BY_ALL_WAS, KOM_RP_WAS, WES),
  STIMMEINGABE_WAHLART_ERGEBNISART_VORLAEUFIG_ERFASSUNGSART_TREND_STIMMZETTEL_NUR_EINZELNER_WAHLVORSCHLAG_WICHTUNG(STIMMEINGABE, LONG,
      singletonList(new LongRangeValidator(100L, 0L)), KOM_BY_ALL_WAS),

  STIMMEINGABE_AWERTE_UEBERNEHMEN(STIMMEINGABE, ENUM, StimmeingabeAwerteUebernehmen.class, WAS),

  // ELECT-6191
  STIMMEINGABE_ABLAGEVERZEICHNIS_F_DATEIEN(STIMMEINGABE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),

  // ELECTKOM-98
  STIMMEINGABE_ERFASSUNGSMASKE_UMGANG_BLANK_ERFASSEN(STIMMEINGABE, ENUM, WahlParameterStimmeingabeErfassungsmaskeUmgangBlank.class, WAS),
  STIMMEINGABE_ERFASSUNGSMASKE_UMGANG_BLANK_ANZEIGEN(STIMMEINGABE, ENUM, WahlParameterStimmeingabeErfassungsmaskeUmgangBlank.class, WAS),
  STIMMEINGABE_ERFASSUNGSMASKE_TAB_ORDER(STIMMEINGABE, ENUM, WahlParameterStimmeingabeErfassungsmaskeTabOrder.class, WAS),
  // ELECTKOM-537
  STIMMEINGABE_ERFASSUNGSMASKE_TAB_KEYS(STIMMEINGABE, ENUM, WahlParameterStimmeingabeErfassungsmaskeTabKeys.class, WAS),
  // ELECT-8349
  STIMMEINGABE_ERFASSUNGSMASKE_LAYOUT_STIMMEINGABE_GRUPPE_STIMMEN(STIMMEINGABE, ENUM,
      WahlParameterStimmeingabeErfassungsmaskeLayoutStimmeingabeGruppeStimmen.class,
      WahlParameterStimmeingabeErfassungsmaskeLayoutStimmeingabeGruppeStimmenFilter.class, c -> NL_WAS.equals(c), WAS),

  // WASDE-1015
  ERGEBNIS_AUSGABE_VERZEICHNIS_MASTER(ERGEBNISSE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),
  ERGEBNIS_AUSGABE_VERZEICHNIS_STATSPEZ(ERGEBNISSE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),
  ERGEBNIS_AUSGABE_VERZEICHNIS_INTERNET(ERGEBNISSE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),
  ERGEBNIS_AUSGABE_VERZEICHNIS_MEDIEN(ERGEBNISSE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),
  // WASDE-1354
  ERGEBNIS_AUSGABE_VERZEICHNIS_LWL(ERGEBNISSE, VERZEICHNIS_BESCHREIBBAR, DESTATIS_WAS),

  ERGEBNIS_DOWNLOAD_ACTIVE(ERGEBNISSE, BOOLEAN, DESTATIS_WAS),
  ERGEBNIS_DOWNLOAD_SECRET(ERGEBNISSE, STRING_SECRET, DESTATIS_WAS),

  // ELECT-5762 Bundeswahlleiterexport
  BUNDESWAHLLEITER_EXPORT_WAHL_KURZNAME(BUNDESWAHLLEITER_EXPORT, STRING, WAS),
  BUNDESWAHLLEITER_EXPORT_GEBIETSART(BUNDESWAHLLEITER_EXPORT, SELECT, new GebietsartenDerAusgewaehltenWahlValuesSupplier(), Function::identity, WAS),
  BUNDESWAHLLEITER_EXPORT_VERZEICHNIS(BUNDESWAHLLEITER_EXPORT, VERZEICHNIS_BESCHREIBBAR, WAS),

  // ELECT-5747
  DOKUMENTENERZEUGUNG_KLEINE_DOKUMENTE_FUER_TEST_ERZEUGEN(DOKUMENTENERZEUGUNG, BOOLEAN, DESTATIS_WAS, DESTATIS_WUS, KOM_BE_WAS, KOM_BB_WAS),

  MAX_ANZAHL_SITZBERECHNUNGEN_IN_VARIANTENBERECHNUNG(SITZBERECHNUNG, LONG, WAS),
  MAX_ANZAHL_SITZBERECHNUNGEN_LOG_EINTRAEGE(SITZBERECHNUNG, LONG, WAS),

  // ELECT-7315
  STIMMENUEBERGABE_WAHL_SCHLUESSEL(STIMMENUEBERGABE, STRING, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_EINSTELLUNG(STIMMENUEBERGABE, ENUM, WahlParameterStimmuebergabeEinstellung.class, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_CRONTAB(STIMMENUEBERGABE, CRONTAB, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_ZIELSYSTEM_URL(STIMMENUEBERGABE, STRING, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_ZIELSYSTEM_MANDANT_NUMMER(STIMMENUEBERGABE, STRING, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_ZIELSYSTEM_BENUTZER(STIMMENUEBERGABE, STRING, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_ZIELSYSTEM_PASSWORT(STIMMENUEBERGABE, STRING_SECRET, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_PLAUSIBILISIERUNG(STIMMENUEBERGABE, ENUM, WahlParameterStimmuebergabePlausibilisierung.class, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_REST_SOCKET_TIMEOUT_IN_SECONDS(STIMMENUEBERGABE, LONG, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_REST_CONNECTION_TIMEOUT_IN_SECONDS(STIMMENUEBERGABE, LONG, STIMMENUEBERGABE_SUPPORT),
  STIMMENUEBERGABE_REST_DISABLE_TRUSTMANAGER(STIMMENUEBERGABE, BOOLEAN, STIMMENUEBERGABE_SUPPORT),

  STIMMEN_LADEN_FUER_SITZBERECHNUNG(SONSTIGES, ENUM, StimmenLadenArt.class, WAS),
  STIMMEN_LADEN_FUER_EXPORTE(SONSTIGES, ENUM, StimmenLadenArt.class, WAS),
  STIMMEN_LADEN_FUER_PRAESENTATION(SONSTIGES, ENUM, StimmenLadenArt.class, WAS),

  WVP_ABGABEFRIST(WVP, STRING, WVP_ANBINDUNG),
  WVP_FRUEHESTES_DATUM_DER_AUFSTELLUNGSVERSAMMLUNG(WVP, DATE, WVP_ANBINDUNG),
  WVP_ZUGRIFFSCODE_PRUEFUNG(WVP, ENUM, ZugriffscodePruefung.class, WVP_ANBINDUNG),

  WAHLLOKALSYSTEM_STATUS_OFFLINE_TIMEOUT_IN_SECONDS(WAHLLOKALSYSTEM, LONG, MUC_WAS), // erstmal nur für MUC relevant
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_CRONTAB(WAHLLOKALSYSTEM, CRONTAB, MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_ZUKUENFTIGE_WERTE(WAHLLOKALSYSTEM, BOOLEAN, MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_MAXIMALE_ABWEICHUNG_IN_MINUTEN(WAHLLOKALSYSTEM, LONG, singletonList(new LongRangeValidator(9999L, 0L)),
      MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_PUFFER_BIS_UEBERNAHME_IN_MINUTEN(WAHLLOKALSYSTEM, LONG, singletonList(new LongRangeValidator(999L, 0L)),
      MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_ERWARTETE_RUECKLAUFQUOTE_BRIEFWAHL(WAHLLOKALSYSTEM, BIGDECIMAL, MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_BRIEFWAHL_OHNE_EINGAENGE_BERUECKSICHTIGEN(WAHLLOKALSYSTEM, ENUM,
      WahllokalsystenWahlbeteiligungUebernehmenBriefwahl.class, MUC_WAS), // ELECTMUC-2306 erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_ANTEIL_NICHT_BETRACHTETER_GEBIETE_NIEDRIGSTE_QUOTE(WAHLLOKALSYSTEM, BIGDECIMAL, MUC_WAS), // erstmal nur MUC
  WAHLLOKALSYSTEM_WAHLBETEILIGUNG_UEBERNEHMEN_ANTEIL_NICHT_BETRACHTETER_GEBIETE_HOECHSTE_QUOTE(WAHLLOKALSYSTEM, BIGDECIMAL, MUC_WAS), // erstmal nur MUC

  MESO_WAHLGEBIET_NUMMER(PERSONENREGISTER, STRING, COMMON_INTERFACES_MESO),
  UNTERSTUETZER_ANZAHL_IMPORT_CRONTAB(PERSONENREGISTER, STRING, DD_WUS),

  EXTERNE_ERGEBNIS_DATEN_VERZEICHNIS(BUNDESWAHLLEITER_EXPORT, VERZEICHNIS, KOM_BB_WAS, KOM_BE_WAS /* ELECT-11393 */), // ELECT-6233

  MUC_WVZ_REIHENFOLGE_EINTRAGUNGSSTELLEN_EXPORT_VERGLEICH(SONSTIGES, VOID, MUC_WVZ), // ELECTMUC-2239

  MUC_WVZ_VERWENDUNG_STRASSENNAME_KURZ_WENN_VORHANDEN_BEI_EXPORT(WAEHLERVERZEICHNIS_EXPORT, BOOLEAN, MUC_WVZ), // ELECTMUC-2393

  // siehe auch de.ivu.elect.business.wahl.boundary.WahlFuerWesExporter.ZU_EXPORTIERENDE_WAHLPARAMETER
  WES_ABLEHNUNGSGRUENDE(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_ABLEHNUNGGRUND_1(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_ABLEHNUNGGRUND_2(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_ABLEHNUNGGRUND_3(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_ABLEHNUNGGRUND_4(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_GUELTIGGRUENDE(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_PAUSENTEXT(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG), // ELECTKOM-2206

  WES_ANZAHL_GUELTIGE_STIMMZETTEL_BIS_PRUEFUNG(CustomParameterKategorie.WES, LONG, WES, WES_UNTERSTUETZUNG),

  // ELECTKOM-2206
  WES_PAUSENBEGINN_NACH_MINUTEN(CustomParameterKategorie.WES, LONG, WES, WES_UNTERSTUETZUNG),

  WES_REST_SOCKET_TIMEOUT_IN_SECONDS(CustomParameterKategorie.WES, LONG, WES),
  WES_REST_CONNECTION_TIMEOUT_IN_SECONDS(CustomParameterKategorie.WES, LONG, WES),
  WES_REST_DISABLE_TRUSTMANAGER(CustomParameterKategorie.WES, BOOLEAN, WES),

  WES_REST_ENABLE_SYSTEM_PROXY(CustomParameterKategorie.WES, BOOLEAN, WES),
  WES_REST_PROXY_HOST(CustomParameterKategorie.WES, STRING, WES, WES_UNTERSTUETZUNG),
  WES_REST_PROXY_PORT(CustomParameterKategorie.WES, INTEGER /* http port range */, WES),
  WES_UEBERTRAGUNGSWEG(CustomParameterKategorie.WES, ENUM, WesUebertragungsweg.class, WES),

  WES_WAS_URL(CustomParameterKategorie.WES, STRING, WES),
  WES_WAS_MANDANT(CustomParameterKategorie.WES, STRING, WES),
  WES_STIMMZETTEL_UPLOAD_SECRET(CustomParameterKategorie.WES, STRING_SECRET, WES),
  WES_PRUEFZIFFER_FORMAT_AUTOMATISCHE_GENERIERUNG(CustomParameterKategorie.WES, ENUM, PruefzifferAutomatischGenerierenFormat.class, WES_UNTERSTUETZUNG),


  /*
   * ELECT-10924, Reihenfolge der DOKUMENT_PLATZHALTER_*-Werte gibt Reihenfolge in der Anzeige vor!
   */

  DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG_KURZ(DOKUMENTPLATZHALTER, STRING, COMMON, WES), // ELECTMUC-2910
  DOKUMENT_PLATZHALTER_ZU_WAEHLENDES_GREMIUM(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLAUSSCHUSSBEZEICHNUNG(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_WAHLPERIODE_BEGINN(DOKUMENTPLATZHALTER, DATE, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLPERIODE_ENDE(DOKUMENTPLATZHALTER, DATE, COMMON, WES),
  DOKUMENT_PLATZHALTER_STICHWAHLDATUM(DOKUMENTPLATZHALTER, DATE, COMMON, WES),

  DOKUMENT_PLATZHALTER_BUNDESLAND_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_LANDKREIS_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_GEMEINDE_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_GEMEINDE_NUMMER(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_WAHLKREIS_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLKREIS_NUMMER(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  // https://de.wikipedia.org/wiki/Stimmkreis_(Bayern) -> MUC, KOM-BY
  DOKUMENT_PLATZHALTER_STIMMKREIS_NAME(DOKUMENTPLATZHALTER, STRING, MUC_BASE, KOM_BY_ALL_WAS, KOM_BY_ALL_WOS, WES),
  DOKUMENT_PLATZHALTER_STIMMKREIS_NUMMER(DOKUMENTPLATZHALTER, STRING, MUC_BASE, KOM_BY_ALL_WAS, KOM_BY_ALL_WOS, WES),
  // https://de.wikipedia.org/wiki/Wahlbereich -> KOM-MV, KOM-NI, KOM-RP, SL (da Bundesland-System immer im Gebietsbaum modelliert!!!) (, KOM-HB, KOM-HE)
  DOKUMENT_PLATZHALTER_WAHLBEREICH_NAME(DOKUMENTPLATZHALTER, STRING, KOM_MV_WAS, KOM_MV_WOS, KOM_NI_WAS, KOM_NI_WOS, KOM_RP_WAS, KOM_RP_WOS, WES),
  DOKUMENT_PLATZHALTER_WAHLBEREICH_NUMMER(DOKUMENTPLATZHALTER, STRING, KOM_MV_WAS, KOM_MV_WOS, KOM_NI_WAS, KOM_NI_WOS, KOM_RP_WAS, KOM_RP_WOS, WES),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_WAHLLEITER_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_GEBIETSNAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_STRASSE(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_HAUSNUMMER(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_PLZ(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_ORT(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_POSTANSCHRIFT_POSTFACH(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_STRASSE(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_HAUSNUMMER(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_PLZ(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_BESUCHANSCHRIFT_ORT(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_NAME(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFON(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_TELEFAX(DOKUMENTPLATZHALTER, STRING, COMMON, WES),
  DOKUMENT_PLATZHALTER_WAHLBEHOERRDE_SACHBEARBEITER_EMAIL(DOKUMENTPLATZHALTER, STRING, COMMON, WES),

  DOKUMENT_PLATZHALTER_STIMMZETTEL_KANDIDATUR_NAMEN_FORMAT(DOKUMENTPLATZHALTER, STRING, KOM_WAS, WES),
  DOKUMENT_PLATZHALTER_STIMMZETTEL_KANDIDATUR_INFOTEXT_FORMAT(DOKUMENTPLATZHALTER, STRING, KOM_WAS, WES),

  EXTERNER_LINK_1_URL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_1_LABEL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_1_PERMISSION(EXTERNE_LINKS, ENUM, ExternerLinkPermission.class, BASE),

  EXTERNER_LINK_2_URL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_2_LABEL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_2_PERMISSION(EXTERNE_LINKS, ENUM, ExternerLinkPermission.class, BASE),

  EXTERNER_LINK_3_URL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_3_LABEL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_3_PERMISSION(EXTERNE_LINKS, ENUM, ExternerLinkPermission.class, BASE),

  EXTERNER_LINK_4_URL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_4_LABEL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_4_PERMISSION(EXTERNE_LINKS, ENUM, ExternerLinkPermission.class, BASE),

  EXTERNER_LINK_5_URL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_5_LABEL(EXTERNE_LINKS, STRING, BASE),
  EXTERNER_LINK_5_PERMISSION(EXTERNE_LINKS, ENUM, ExternerLinkPermission.class, BASE),

  NL_EML_KEYSTORE_PATH(SONSTIGES, STRING, NL_WAS),
  NL_EML_KEYSTORE_PASSWORD(SONSTIGES, STRING_SECRET, NL_WAS),

  KOM_ST_STALA_SENDER_BENUTZERNAME(ERGEBNISSE, STRING, KOM_ST_WAS),

  AUFGABE_ICS_EXPORT_PREFIX(SONSTIGES, STRING, AUFGABENVERWALTUNG),

  WAHL_RESET_OPTION_AWERTE_LOESCHEN(SONSTIGES, BOOLEAN, WAS),

  GOV_EXPRESS_ID(SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_EMPFAENGER(SONSTIGES, STRING, GOV_EXPRESS_ANBINDUNG),
  GOV_EXPRESS_WAHL_MODUS(SONSTIGES, ENUM, GovExpressWahlModus.class, GOV_EXPRESS_ANBINDUNG);

  private static final long MAX_WAEHLERVERZEICHNIS_ANZAHL_ZEILEN = Long.MAX_VALUE;

  private static final long MAX_WAEHLERVERZEICHNIS_ANZAHL_ZUSAETZLICHE_SEITEN = Long.MAX_VALUE;

  private final List<Customer> customers;

  private final Predicate<Customer> customersExcludedFilter;

  private final CustomParameterKategorie kategorie;

  private final int kategoriePosition;

  private final CustomParameterWertTyp wertTyp;

  private final List<Validator> wertValidators;

  private final Supplier<List<String>> wertStringValues;

  private final Supplier<Function<String, String>> wertStringValueToLabelFct;

  private final Class<? extends Enum<?>> wertEnumClass;

  private final Class<? extends CustomParameterFilter<WahlParameter, ? extends Enum<?>>> filter;

  WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Customer... customers) {
    this(kategorie, wertTyp, emptyList(), customers);
  }

  WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, List<Validator> wertValidators, Customer... customers) {
    this(kategorie, wertTyp, null, null, wertValidators, c -> false, customers);
  }

  WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<? extends Enum<?>> wertEnumClass, Customer... customers) {
    this(kategorie, wertTyp, wertEnumClass, null, c -> false, customers);
  }

  <E extends Enum<?>> WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass, Class<? extends CustomParameterFilter<WahlParameter, E>> filter,
                                         Predicate<Customer> customersExcludedFilter, Customer... customers) {
    this(kategorie, wertTyp, wertEnumClass, filter, emptyList(), customersExcludedFilter, customers);
  }

  <E extends Enum<?>> WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass, Class<? extends CustomParameterFilter<WahlParameter, E>> filter,
                                         List<Validator> wertValidators, Predicate<Customer> customersExcludedFilter, Customer... customers) {
    this(kategorie, wertTyp, wertEnumClass, filter, Collections::emptyList, Function::identity, wertValidators, customersExcludedFilter, customers);
  }

  WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Supplier<List<String>> wertStringValues, Supplier<Function<String, String>> wertStringValueToLabelFct,
                     Customer... customers) {
    this(kategorie, wertTyp, null, null, wertStringValues, wertStringValueToLabelFct, emptyList(), customers);
  }

  <E extends Enum<?>> WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass, Class<? extends CustomParameterFilter<WahlParameter, E>> filter,
                                         Supplier<List<String>> wertStringValues, Supplier<Function<String, String>> wertStringValueToLabelFct, List<Validator> wertValidators, Customer... customers) {
    this(kategorie, wertTyp, wertEnumClass, filter, wertStringValues, wertStringValueToLabelFct, wertValidators, c -> false, customers);
  }

  <E extends Enum<?>> WahlParameterWerte(CustomParameterKategorie kategorie, CustomParameterWertTyp wertTyp, Class<E> wertEnumClass, Class<? extends CustomParameterFilter<WahlParameter, E>> filter,
                                         Supplier<List<String>> wertStringValues, Supplier<Function<String, String>> wertStringValueToLabelFct, List<Validator> wertValidators, Predicate<Customer> customersExcludedFilter,
                                         Customer... customers) {
    this.customers = asList(customers);
    this.customersExcludedFilter = customersExcludedFilter;

    this.kategorie = kategorie;
    this.kategoriePosition = ordinal();

    this.wertTyp = wertTyp;
    this.wertValidators = wertValidators;

    this.wertStringValues = wertStringValues;
    this.wertStringValueToLabelFct = wertStringValueToLabelFct;

    this.wertEnumClass = wertEnumClass;
    this.filter = filter;
  }

  @Override
  public List<Customer> getCustomers() {
    return customers;
  }

  @Override
  public CustomParameterKategorie getKategorie() {
    return kategorie;
  }

  @Override
  public KonfigurationNotify getKonfigurationNotify() {
    if (getWertTyp().expectsWertIsSecret()) {
      return KonfigurationNotify.BENACHRICHTIGEN_OHNE_WERTE;
    }

    return KonfigurationNotify.BENACHRICHTIGEN; // ELECT-16141, LEGACY...
  }

  @Override
  public int getKategoriePosition() {
    return kategoriePosition;
  }

  @Override
  public String getKey() {
    return name();
  }

  @Override
  public CustomParameterWertTyp getWertTyp() {
    return wertTyp;
  }

  @Override
  public Class<? extends Enum<?>> getWertEnumClass() {
    return wertEnumClass;
  }

  @Override
  public Class<? extends CustomParameterFilter<WahlParameter, ? extends Enum<?>>> getFilter() {
    return filter;
  }

  @Override
  public Supplier<List<String>> getWertStringValues() {
    return wertStringValues;
  }

  @Override
  public Supplier<Function<String, String>> getWertStringValueToLabelFct() {
    return wertStringValueToLabelFct;
  }

  @Override
  public List<Validator> getWertValidators() {
    return wertValidators;
  }

  @Override
  public boolean isCustomerExcluded(Customer customer) {
    return customersExcludedFilter.test(customer);
  }

  @Nullable
  public MandantKonfigurationWerte getKorresponierendenMandantParameter() {
    try {
      return MandantKonfigurationWerte.valueOf(name());
    } catch (Exception e) {
      return null;
    }
  }

  private static class Constants {

    public static final int MAX_RENDER_THREADS = 128;
  }
}
