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

import static java.util.Arrays.asList;

import java.util.Optional;

import de.ivu.elect.business.customdata.entity.CustomDataStorage;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeDirektstimmenAnzahlenUngleichGruppeListenstimmenAnzahlenPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerProWahlvorschlagPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeStimmenAnzahlComparedToTheoretischesMinimumByAnzahlNennungenProWahlvorschlagPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeStimmenAnzahlenUngleichGueltigeStimmenAnzahlenAnteilePlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerAnteilPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerGroesserNullPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GueltigeStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.GueltigeStimmenAnzahlComparedToWaehlerGesamtAnzahlMinusUngueltigeStimmenAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.ListenkandidaturStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerProListenkandidaturPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.ListenkandidaturStimmenAnzahlComparedToTheoretischesMinimumByAnzahlNennungenProWahlvorschlagPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.PruefkennzeichenWahlberechtigteErfasstPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.PruefkennzeichenWahlberechtigteGleichPruefkennzeichenWahlberechtigteAmGebietPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlComparedToAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlEndgueltigGleichStimmeingabeAnzahlVorlaeufigPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlGleichNullPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlGroesserNullPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlInVorstufenGleichPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlKonvertierbarPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabeAnzahlenUngleichStimmeingabeAnzahlenInAnderenErfassungsgebietenPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WaehlerAusBriefwahlbezirkErfasstInUrnenwahlbezirkAnzahlComparedToWaehlerMitWahlscheinAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WaehlerGesamtAnzahlComparedToTheoretischesMaximumByGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WaehlerGesamtAnzahlComparedToTheoretischesMinimumByGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WaehlerOhneWahlscheinAnzahlBerechnetComparedToStimmeingabeAnzahlAnteilPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WaehlerOhneWahlscheinAnzahlBerechnetComparedToStimmeingabeAnzahlPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausiCustomData;
import de.ivu.elect.business.stimmeingabe.control.plausi.WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData;
import de.ivu.elect.business.wahl.boundary.UmgangAWerteKonfiguration;
import de.ivu.elect.business.wahl.boundary.UmgangBWerteKonfiguration;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;

// BESTEHENDE WERTE NICHT LÖSCHEN, sondern als deprecated markieren, da die Werte der Enum, bspw. am Stimmeingabefehler, in der DB gespeichert werden!!!
public enum StimmeingabePlausiTyp {

  UNBEKANNT(StimmeingabePlausiKonfigurationCustomDataHavingNoParameters.class),

  STIMMEINGABE_ANZAHL_KONVERTIERBAR(StimmeingabeAnzahlKonvertierbarPlausiCustomData.class),
  STIMMEINGABE_ANZAHL_ENDGUELTIG_GLEICH_STIMMEINGABE_ANZAHL_VORLAEUFIG(StimmeingabeAnzahlEndgueltigGleichStimmeingabeAnzahlVorlaeufigPlausiCustomData.class),
  STIMMEINGABE_ANZAHL_IN_VORSTUFEN_GLEICH(StimmeingabeAnzahlInVorstufenGleichPlausiCustomData.class),
  STIMMEINGABE_ANZAHLEN_UNGLEICH_STIMMEINGABE_ANZAHLEN_IN_ANDEREN_ERFASSUNGSGEBIETEN(StimmeingabeAnzahlenUngleichStimmeingabeAnzahlenInAnderenErfassungsgebietenPlausiCustomData.class) {

    @Override
    public boolean isHashCodeRelevant() {
      return true;
    }
  },

  PRUEFKENNZEICHEN_WAHLBERECHTIGTE_ERFASST(PruefkennzeichenWahlberechtigteErfasstPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isPruefkennzeichenWahlberechtigteBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  PRUEFKENNZEICHEN_WAHLBERECHTIGTE_GLEICH_PRUEFKENNZEICHEN_WAHLBERECHTIGTE_AM_GEBIET(PruefkennzeichenWahlberechtigteGleichPruefkennzeichenWahlberechtigteAmGebietPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isPruefkennzeichenWahlberechtigteBeiStimmeingabeZuPlausibilisierenGegenPruefkennzeichenWahlberechtigteAmGebiet(wahl, ergebnisart, gebietsart);
    }
  },

  WAHLBERECHTIGTE_OHNE_WAHLSCHEIN_ANZAHL_GLEICH_NULL(StimmeingabeAnzahlGleichNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_OHNE_WAHLSCHEIN_ANZAHL_GLEICH_ANZAHL_AM_GEBIET(WahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeZuPlausibilisierenGegenWahlberechtigteOhneWahlscheinAmGebiet(wahl, ergebnisart, gebietsart);
    }
  },

  WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_GLEICH_NULL(StimmeingabeAnzahlGleichNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_GLEICH_ANZAHL_AM_GEBIET(WahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeZuPlausibilisierenGegenWahlberechtigteMitWahlscheinAmGebiet(wahl, ergebnisart, gebietsart);
    }
  },

  WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL_GLEICH_NULL(StimmeingabeAnzahlGleichNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteNichtImWaehlerverzeichnisBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL_GLEICH_ANZAHL_AM_GEBIET(WahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteNichtImWaehlerverzeichnisBeiStimmeingabeZuPlausibilisierenGegenWahlberechtigteNichtImWaehlerverzeichnisAmGebiet(wahl, ergebnisart, gebietsart);
    }
  },

  WAHLBERECHTIGTE_GESAMT_ANZAHL_GLEICH_NULL(StimmeingabeAnzahlGleichNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_GESAMT_ANZAHL_GLEICH_ANZAHL_AM_GEBIET(WahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeZuPlausibilisierenGegenWahlberechtigteGesamtAmGebiet(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_GESAMT_ANZAHL_GLEICH_WAHLBERECHTIGTE_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && (umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
              || umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
              || umgangAWerteKonfiguration.isWahlberechtigteNichtImWaehlerverzeichnisBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart));
    }
  },
  WAHLBERECHTIGTE_GESAMT_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAHLBERECHTIGTE_GESAMT_COMPARED_TO_VORPERIODE_KLEINER_GLEICH_SCHWELLWERT(WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData.class), // WASDE-1558

  WAEHLER_OHNE_WAHLSCHEIN_ANZAHL_KLEINER_GLEICH_WAHLBERECHTIGTE_OHNE_WAHLSCHEIN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_OHNE_WAHLSCHEIN_ANZAHL_GLEICH_NULL(StimmeingabeAnzahlGleichNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },

  WAEHLER_OHNE_WAHLSCHEIN_BERECHNET_ANZAHL_KLEINER_WAHLBERECHTIGTE_OHNE_WAHLSCHEIN_ANZAHL_ANTEIL(WaehlerOhneWahlscheinAnzahlBerechnetComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBerechnetBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_OHNE_WAHLSCHEIN_BERECHNET_ANZAHL_KLEINER_GLEICH_WAHLBERECHTIGTE_OHNE_WAHLSCHEIN_ANZAHL(WaehlerOhneWahlscheinAnzahlBerechnetComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBerechnetBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && !umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },

  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_GLEICH_WAEHLER_MIT_WAHLSCHEIN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerMitWahlscheinInUrnenwahlAnzahlAusUrnenwahlBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerMitWahlscheinInUrnenwahlAnzahlAusBriefwahlBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return !WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_PLUS_WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL.isRelevant(wahl, ergebnisart, gebietsart,
          umgangAWerteKonfiguration, umgangBWerteKonfiguration) && umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_PLUS_WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL(
      StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return isWahlartRelevant(wahl) && umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteNichtImWaehlerverzeichnisBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }

    private boolean isWahlartRelevant(Wahl wahl) {
      return asList(CommonWahlart.BUNDESTAGSWAHL, CommonWahlart.EUROPAWAHL, CommonWahlart.LANDTAGSWAHL_BAYERN, CommonWahlart.BEZIRKSWAHL_BAYERN).stream()
          .anyMatch(wahlartTemplate -> wahlartTemplate.equalsWahlart(wahl));
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return !WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_PLUS_WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL_ANTEIL.isRelevant(wahl, ergebnisart, gebietsart,
          umgangAWerteKonfiguration, umgangBWerteKonfiguration) && umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAHLBERECHTIGTE_MIT_WAHLSCHEIN_ANZAHL_PLUS_WAHLBERECHTIGTE_NICHT_IM_WAEHLERVERZEICHNIS_ANZAHL_ANTEIL(
      StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return isWahlartRelevant(wahl) && umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteNichtImWaehlerverzeichnisBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }

    private boolean isWahlartRelevant(Wahl wahl) {
      return asList(CommonWahlart.BUNDESTAGSWAHL, CommonWahlart.EUROPAWAHL).stream().anyMatch(wahlartTemplate -> wahlartTemplate.equalsWahlart(wahl));
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN_ANZAHL_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },

  WAEHLER_AUS_BRIEFWAHLBEZIRK_ERFASST_IN_URNENWAHLBEZIRK_ANZAHL_KLEINER_GLEICH_WAEHLER_MIT_WAHLSCHEIN_ANZAHL(
      WaehlerAusBriefwahlbezirkErfasstInUrnenwahlbezirkAnzahlComparedToWaehlerMitWahlscheinAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
          && umgangBWerteKonfiguration.isWaehlerMitWahlscheinInUrnenwahlAnzahlAusBriefwahlBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && !umgangBWerteKonfiguration.isWaehlerMitWahlscheinInUrnenwahlAnzahlAusUrnenwahlBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },

  WAEHLER_GESAMT_ANZAHL_KLEINER_WAHLBERECHTIGTE_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_KLEINER_GLEICH_WAHLBERECHTIGTE_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GLEICH_GUELTIGE_DIREKTSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_DIREKTSTIMMEN_ANZAHL(StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GLEICH_GUELTIGE_LISTENSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL(StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GLEICH_GUELTIGE_REFERENDUM_STIMMEN_ANZAHL_PLUS_UNGUELTIGE_REFERENDUM_STIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GLEICH_WAEHLER_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && (umgangBWerteKonfiguration.isWaehlerOhneWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart)
              || umgangBWerteKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart));
    }
  },
  WAEHLER_GESAMT_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_GUELTIGE_STIMMEN_ANZAHL_PLUS_UNGUELTIGE_STIMMEN_ANZAHL(
      WaehlerGesamtAnzahlComparedToTheoretischesMaximumByGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_GLEICH_THEORETISCHES_MINIMUM_BY_GUELTIGE_STIMMEN_ANZAHL_PLUS_UNGUELTIGE_STIMMEN_ANZAHL(
      WaehlerGesamtAnzahlComparedToTheoretischesMinimumByGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_GLEICH_GUELTIGE_DIREKTSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_DIREKTSTIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_GLEICH_GUELTIGE_LISTENSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_GLEICH_MINDESTANZAHL(StimmeingabeAnzahlComparedToAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart);
    }
  },
  WAEHLER_GESAMT_ANZAHL_GROESSER_WAHLBERECHTIGTE_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangBWerteKonfiguration.isWaehlerGesamtBeiStimmeingabeZuPlausibilisieren(wahl, ergebnisart, gebietsart)
          && umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },

  STIMMZETTEL_GESAMT_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),
  STIMMZETTEL_GESAMT_ANZAHL_GLEICH_STIMMZETTEL_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  STIMMZETTEL_GESAMT_ANZAHL_KLEINER_GLEICH_WAHLBERECHTIGTE_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class) {

    @Override
    public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
        UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
      return umgangAWerteKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeRelevant(wahl, ergebnisart, gebietsart);
    }
  },
  STIMMZETTEL_GESAMT_ANZAHL_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  STIMMZETTEL_GESAMT_ANZAHL_GLEICH_WAEHLER_GESAMT_ANZAHL_MINUS_STIMMZETTEL_ZUWENIG_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  STIMMZETTEL_GESAMT_ANZAHL_GLEICH_WAEHLER_GESAMT_ANZAHL_PLUS_STIMMZETTEL_ZUVIEL_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  STIMMZETTEL_GESAMT_ANZAHL_UNGLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),

  STIMMZETTEL_ZUWENIG_ANZAHL_GLEICH_STIMMZETTEL_ZUWENIG_GRUENDE_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  STIMMZETTEL_ZUVIEL_ANZAHL_GLEICH_STIMMZETTEL_ZUVIEL_GRUENDE_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),

  GUELTIGE_DIREKTSTIMMEN_ANZAHL_GLEICH_GRUPPE_DIREKTSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_DIREKTSTIMMEN_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),

  GUELTIGE_LISTENSTIMMEN_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_LISTENSTIMMEN_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  GUELTIGE_LISTENSTIMMEN_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),

  GUELTIGE_LISTENSTIMMEN_ABZUZIEHEN_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_ABZUZIEHEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme

  GUELTIGE_REFERENDUM_STIMMEN_ANZAHL_GLEICH_REFERENDUM_OPTION_REFERENDUM_STIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  GUELTIGE_REFERENDUM_STIMMEN_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),

  UNGUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_GUELTIGE_DIREKTSTIMMEN_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  UNGUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),
  UNGUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),

  UNGUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_GUELTIGE_LISTENSTIMMEN_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  UNGUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),

  BLANKO_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),

  GRUPPE_DIREKTSTIMMEN_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),

  GRUPPE_LISTENSTIMMEN_ANZAHL_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class),
  GRUPPE_LISTENSTIMMEN_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. (Stimmen der Listenkandidaturen) zusammen

  GRUPPE_DIREKTSTIMMEN_ANZAHLEN_UNGLEICH_GRUPPE_LISTENSTIMMEN_ANZAHLEN(GruppeDirektstimmenAnzahlenUngleichGruppeListenstimmenAnzahlenPlausiCustomData.class), // A.k.a. Erst- und Zweitstimmen nicht identisch

  GRUPPE_STIMMEN_ANZAHLEN_UNGLEICH_GUELTIGE_STIMMEN_ANZAHLEN_ANTEILE(GruppeStimmenAnzahlenUngleichGueltigeStimmenAnzahlenAnteilePlausiCustomData.class), // ELECT-16548

  GRUPPE_STIMMEN_ANZAHLEN_UNGLEICH_GRUPPE_STIMMEN_ANZAHLEN_IN_ANDEREN_ERFASSUNGSGEBIETEN(GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData.class) {

    @Override
    public boolean isHashCodeRelevant() {
      return true;
    }
  },

  GRUPPE_LISTENSTIMMEN_ANTEIL_COMPARED_TO_VORPERIODE_KLEINER_GLEICH_SCHWELLWERT(GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData.class), // WASDE-1341

  /*
   * Kommunalwahlen
   */

  // Erfassungsmaske für Wahlvorschläge
  WAEHLER_GESAMT_ANZAHL_GLEICH_GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME_PLUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class),
  /**
   * @see StimmeingabePlausiTyp#GUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER
   */
  GUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER(GueltigeStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerPlausiCustomData.class),

  GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME_GROESSER_NULL(StimmeingabeAnzahlGroesserNullPlausiCustomData.class), // A.k.a. Gültige Stimmzettel
  GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME_KLEINER_GLEICH_GUELTIGE_LISTENSTIMMEN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  GRUPPE_LISTENSTIMMEN_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHLEN_SUMME_PLUS_WAHLVORSCHLAG_LISTENSTIMMEN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Stimmen nur für die Liste + Stimmen für Listenkandidaturen zusammen

  GRUPPE_LISTENSTIMMEN_SPALTE_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GRUPPE_LISTENSTIMMEN_GESAMT_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_SPALTE_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Summe der Spaltensummen

  // Erfassungsmaske für Listenkandidaturen
  LISTENKANDIDATUR_LISTENSTIMMEN_SPALTE_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  LISTENKANDIDATUR_LISTENSTIMMEN_GESAMT_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_SPALTE_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Summe der Spaltensummen

  /*
   * DD
   */

  // Kommunalwahlen - Erfassungsmaske für Wahlvorschläge
  /**
   * @deprecated Etwas fraglich, scheint nur eine andere Art zu sein, StimmeingabePlausiTyp#WAEHLER_GESAMT_ANZAHL_GLEICH_GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME_PLUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL
   *             auszudrücken!!!
   * @see StimmeingabePlausiTyp#STIMMZETTEL_GESAMT_ANZAHL_GLEICH_STIMMZETTEL_ANZAHLEN_SUMME
   */
  GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME_GLEICH_WAEHLER_GESAMT_ANZAHL_MINUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL(
      GueltigeStimmenAnzahlComparedToWaehlerGesamtAnzahlMinusUngueltigeStimmenAnzahlPlausiCustomData.class),

  // Kommunalwahlen - Erfassungsmaske für Listenkandidaturen
  LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_GUELTIGE_LISTENSTIMMEN_ZWISCHENSUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class), // Nur bei Mehrheitswahl!

  /*
   * BY (MUC, KOM)
   */

  // Referenden
  ABGEGEBENE_REFERENDUM_STIMMEN_ANZAHL_GLEICH_GUELTIGE_REFERENDUM_STIMMEN_ANZAHL_PLUS_UNGUELTIGE_REFERENDUM_STIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class),
  ABGEGEBENE_REFERENDUM_STIMMEN_ANZAHL_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  // Kommunalwahlen - Erfassungsmaske für Wahlvorschläge
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_ANTEIL(
      GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerAnteilPlausiCustomData.class),
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER(
      GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerPlausiCustomData.class),
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_GROESSER_NULL(GueltigeStimmenAnzahlBerechnetByAnzahlStimmenProWaehlerGroesserNullPlausiCustomData.class),

  /**
   * @deprecated Spezialfall (Anzahl Sitze == Anzahl Stimmen pro Wähler)
   * @see StimmeingabePlausiTyp#GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_ANTEIL
   */
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_SITZE_KLEINER_THEORETISCHES_MAXIMUM_BY_ANZAHL_SITZE_ANTEIL(
      GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_ANTEIL.getCustomDataClass()),
  /**
   * @deprecated Spezialfall (Anzahl Sitze == Anzahl Stimmen pro Wähler)
   * @see StimmeingabePlausiTyp#GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER
   */
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_SITZE_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_SITZE(
      GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER.getCustomDataClass()),
  /**
   * @deprecated Spezialfall (Anzahl Sitze == Anzahl Stimmen pro Wähler)
   * @see StimmeingabePlausiTyp#GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_GROESSER_NULL
   */
  GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_SITZE_GROESSER_NULL(GUELTIGE_LISTENSTIMMEN_ANZAHL_BERECHNET_BY_ANZAHL_STIMMEN_PRO_WAEHLER_GROESSER_NULL.getCustomDataClass()),

  GUELTIGE_LISTENSTIMMEN_SUMME_WAHLVORSCHLAG_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_SUMME_WAHLVORSCHLAG_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_PANASCHIERT_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_PANASCHIERT_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme
  GUELTIGE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHL_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHLEN_SUMME(StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class), // A.k.a. Spaltensumme

  GUELTIGE_LISTENSTIMMEN_SUMME_WAHLVORSCHLAG_ANZAHL_GLEICH_GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_ANZAHL_PLUS_GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHL(
      StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  GUELTIGE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHL_KLEINER_GLEICH_GUELTIGE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHL_KLEINER_GLEICH_GRUPPE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),
  GRUPPE_LISTENSTIMMEN_SUMME_WAHLVORSCHLAG_ANZANL_GLEICH_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_ANZAHL_PLUS_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_VERAENDERT_ANZAHL(
      StimmeingabeAnzahlComparedToStimmeingabeAnzahlenSummePlausiCustomData.class),
  GRUPPE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHL_GROESSER_GLEICH_THEORETISCHES_MINIMUM_BY_ANZAHL_NENNUNGEN_PRO_LISTENKANDIDATUR(
      GruppeStimmenAnzahlComparedToTheoretischesMinimumByAnzahlNennungenProWahlvorschlagPlausiCustomData.class),
  GRUPPE_LISTENSTIMMEN_SUMME_LISTENKANDIDATUREN_ANZAHL_GLEICH_LISTENKANDIDATUR_LISTENSTIMMEN_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  // Kommunalwahlen - Erfassungsmaske für Listenkandidaturen
  GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_GESAMT_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_WAHLVORSCHLAG_UNVERAENDERT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_GROESSER_GLEICH_THEORETISCHES_MINIMUM_BY_ANZAHL_NENNUNGEN_PRO_LISTENKANDIDATUR(
      ListenkandidaturStimmenAnzahlComparedToTheoretischesMinimumByAnzahlNennungenProWahlvorschlagPlausiCustomData.class),
  /**
   * @see StimmeingabePlausiTyp#GRUPPE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_DIREKTKANDIDATUR
   */
  LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_LISTENKANDIDATUR(
      ListenkandidaturStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerProListenkandidaturPlausiCustomData.class),
  /**
   * @deprecated Spezialfall (Anzahl Nennungen maximal == Anzahl Stimmen pro Wähler pro Listenkandidatur)
   * @see StimmeingabePlausiTyp#LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_LISTENKANDIDATUR
   */
  LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_NENNUNGEN_PRO_LISTENKANDIDATUR(
      LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_LISTENKANDIDATUR.getCustomDataClass()),

  // Landtagswahl - Erfassungsmaske für Wahlvorschläge
  WAEHLER_DIREKTSTIMMEN_ZWISCHENSUMME_GLEICH_GUELTIGE_DIREKTSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_DIREKTSTIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class),
  WAEHLER_DIREKTSTIMMEN_ZWISCHENSUMME_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class), // Nur für Briefwahlbezirke
  // NOTE, dass laut dem Landeswahlleiter dieselbe Plausi zweimal mit verschiedenen Anteilen hinzugefügt werden muss!
  WAEHLER_DIREKTSTIMMEN_ZWISCHENSUMME_GROESSER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_1(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  WAEHLER_DIREKTSTIMMEN_ZWISCHENSUMME_GROESSER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_2(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  WAEHLER_DIREKTSTIMMEN_ZWISCHENSUMME_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  // NOTE ELECTMUC-2294, dass laut dem Landeswahlleiter dieselbe Plausi NUN NICHT MEHR zweimal mit verschiedenen Anteilen hinzugefügt werden muss!
  // UNGUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_1,
  UNGUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_WAEHLER_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),

  WAEHLER_LISTENSTIMMEN_ZWISCHENSUMME_GLEICH_GUELTIGE_LISTENSTIMMEN_ANZAHL_PLUS_UNGUELTIGE_LISTENSTIMMEN_ANZAHL(
      StimmeingabeAnzahlComparedToGueltigeStimmenAnzahlPlusUngueltigeStimmenAnzahlPlausiCustomData.class),
  WAEHLER_LISTENSTIMMEN_ZWISCHENSUMME_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class), // Nur für Briefwahlbezirke
  // NOTE, dass laut dem Landeswahlleiter dieselbe Plausi zweimal mit verschiedenen Anteilen hinzugefügt werden muss!
  WAEHLER_LISTENSTIMMEN_ZWISCHENSUMME_GROESSER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_1(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  WAEHLER_LISTENSTIMMEN_ZWISCHENSUMME_GROESSER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_2(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),
  WAEHLER_LISTENSTIMMEN_ZWISCHENSUMME_KLEINER_GLEICH_WAEHLER_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  // NOTE ELECTMUC-2294, dass laut dem Landeswahlleiter dieselbe Plausi NUN NICHT MEHR zweimal mit verschiedenen Anteilen hinzugefügt werden muss!
  // UNGUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_WAEHLER_GESAMT_ANZAHL_ANTEIL_STUFE_1,
  UNGUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_WAEHLER_GESAMT_ANZAHL_ANTEIL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlAnteilPlausiCustomData.class),

  // Landtagswahl - Erfassungsmaske für Listenkandidaturen
  GRUPPE_LISTENSTIMMEN_ANZAHL_GLEICH_GRUPPE_LISTENSTIMMEN_GESAMT_ANZAHL(StimmeingabeAnzahlComparedToStimmeingabeAnzahlPlausiCustomData.class),

  // Seniorenvertretungswahl
  GUELTIGE_DIREKTSTIMMEN_ANZAHL_GROESSER_GLEICH_WAEHLER_GESAMT_ANZAHL_MINUS_UNGUELTIGE_DIREKTSTIMMEN_ANZAHL(
      GueltigeStimmenAnzahlComparedToWaehlerGesamtAnzahlMinusUngueltigeStimmenAnzahlPlausiCustomData.class),
  /**
   * @see StimmeingabePlausiTyp#GUELTIGE_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER
   */
  GUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER(GueltigeStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerPlausiCustomData.class),

  /**
   * @see StimmeingabePlausiTyp#LISTENKANDIDATUR_LISTENSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_LISTENKANDIDATUR
   */
  GRUPPE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_DIREKTKANDIDATUR(
      GruppeStimmenAnzahlComparedToTheoretischesMaximumByAnzahlStimmenProWaehlerProWahlvorschlagPlausiCustomData.class),

  /**
   * @deprecated Spezialfall (Anzahl Sitze == Anzahl Stimmen pro Wähler)
   * @see StimmeingabePlausiTyp#GUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER
   */
  GUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_SITZE(
      GUELTIGE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER.getCustomDataClass()),

  /**
   * @deprecated Spezialfall (Anzahl Stimmen pro Wähler pro Wahlvorschlag == Anzahl Stimmen pro Wähler pro Direktkandidatur)
   * @see StimmeingabePlausiTyp#GRUPPE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_DIREKTKANDIDATUR
   */
  GRUPPE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_DIREKTSTIMMEN_PRO_WAEHLER_PRO_WAHLVORSCHLAG(
      GRUPPE_DIREKTSTIMMEN_ANZAHL_KLEINER_GLEICH_THEORETISCHES_MAXIMUM_BY_ANZAHL_STIMMEN_PRO_WAEHLER_PRO_DIREKTKANDIDATUR.getCustomDataClass()),

  ;

  private Class< ? extends StimmeingabePlausiKonfigurationCustomData> customDataClass;

  StimmeingabePlausiTyp(Class< ? extends StimmeingabePlausiKonfigurationCustomData> customDataClass) {
    this.customDataClass = customDataClass;
  }

  public StimmeingabePlausiKonfigurationCustomData newCustomDataInstance() {
    try {
      StimmeingabePlausiKonfigurationCustomData customData = getCustomDataClass().getDeclaredConstructor().newInstance();
      new CustomDataStorage(customData); // ELECT-14778

      return customData;
    } catch (Exception ex) {
      throw new IllegalArgumentException(ex);
    }
  }

  public Class< ? extends StimmeingabePlausiKonfigurationCustomData> getCustomDataClass() {
    return customDataClass;
  }

  public boolean isRelevant(Wahl wahl, WahlartErgebnisart ergebnisart, Optional<StimmeingabePlausiGebietsart> gebietsart, UmgangAWerteKonfiguration umgangAWerteKonfiguration,
      UmgangBWerteKonfiguration umgangBWerteKonfiguration) {
    return true;
  }

  public boolean isHashCodeRelevant() {
    return false; // Ist der HashCode am Ergebniseingang notwendig
  }
}
