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

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.NlSystemGruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;
import de.ivu.elect.business.stimmeingabe.control.NlStimmeingabeKopfzahlKonfiguration;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;

public enum NlVoteType {

  WAHLBERECHTIGTE {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.WAHLBERECHTIGTE;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isWahlberechtigteGesamtBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  GUELTIGE_INSGESAMT {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.GUELTIGE;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.LISTENSTIMME;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return getNlSystemGruppe().isStimmenartRelevantAufGebiet(wahldurchfuehrungsgebiet, ergebnisart, getStimmenart());
    }
  },
  UNGUELTIGE {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.UNGUELTIGE;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.LISTENSTIMME;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return getNlSystemGruppe().isStimmenartRelevantAufGebiet(wahldurchfuehrungsgebiet, ergebnisart, getStimmenart());
    }
  },
  BLANCO {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.BLANKO;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.LISTENSTIMME_LEER;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return getNlSystemGruppe().isStimmenartRelevantAufGebiet(wahldurchfuehrungsgebiet, ergebnisart, getStimmenart());
    }
  },
  WAEHLER_OHNE_WAHLSCHEIN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.WAEHLER;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.OHNE_WAHLSCHEIN;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isWaehlerOhneWahlscheinBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  WAEHLER_MIT_VOLLMACHT {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.WAEHLER;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.MIT_VOLLMACHT;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isWaehlerMitVollmachtBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  WAEHLER_MIT_WAHLSCHEIN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.WAEHLER;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.MIT_WAHLSCHEIN;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isWaehlerMitWahlscheinBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  WAEHLER_GESAMT {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.WAEHLER;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isWaehlerGesamtBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_EINGENOMMEN_ZU_VIEL {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_ZUVIEL;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendZuvielBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_EINGENOMMEN_ZU_WENIG {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_ZUWENIG;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendZuwenigBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_NICHT_ABGEGEBEN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_AUSGEGEBEN_NICHT_ABGEGEBEN;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundAusgegebenNichtAbgegebenBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_ZU_WENIG_AUSGEGEBEN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_AUSGEGEBEN_ZUWENIG;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundAusgegebenZuwenigBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_ZU_VIEL_AUSGEGEBEN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_AUSGEGEBEN_ZUVIEL;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundAusgegebenZuvielBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_ABWEICHEND_UNBEKANNTER_GRUND {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_UNBEKANNT;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundUnbekanntBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  STIMMZETTEL_ABWEICHEND_ANDERER_GRUND {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_SONSTIGES;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundSonstigesBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  BRIEFWAHL_STIMMZETTEL_VERLOREN {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_VERLOREN;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundVerlorenBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  BRIEFWAHL_STIMMZETTEL_EINGENOMMEN_ZU_VIEL {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_IN_WAHLBRIEF_ZUVIEL;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundInWahlbriefZuvielBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  },
  BRIEFWAHL_STIMMZETTEL_EINGENOMMEN_ZU_WENIG {

    @Override
    public NlSystemGruppe getNlSystemGruppe() {
      return NlSystemGruppe.STIMMZETTEL_EINGENOMMEN_ABWEICHEND;
    }

    @Override
    public Stimmenart getStimmenart() {
      return Stimmenart.GESAMT_ABWEICHEND_GRUND_IN_WAHLBRIEF_ZUWENIG;
    }

    @Override
    public boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
      return stimmeingabeKopfzahlKonfiguration.isStimmzettelEingenommenAbweichendGrundInWahlbriefZuwenigBeiStimmeingabeRelevant(wahldurchfuehrungsgebiet, ergebnisart);
    }
  };

  public abstract boolean isMussErfasstWerden(NlStimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart);

  public abstract Stimmenart getStimmenart();

  public SystemGruppe getSystemGruppe() {
    return getNlSystemGruppe().getSystemGruppe();
  }

  public abstract NlSystemGruppe getNlSystemGruppe();
}
