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

import de.ivu.elect.business.auffaelligkeit.control.EntscheidungsgrenzenFuerAuffaelligkeit;

public enum AuffaelligkeitsbemerkungenErzeugerToleranz {

  STRIKT {
    @Override
    public EntscheidungsgrenzenFuerAuffaelligkeit getEntscheidungsgrenzenFuerAuffaelligkeit() {
      double faktor = 0.5;
      return erzeugeEntscheidungsgrenzenFuerAuffaelligkeit(faktor);
    }
  },
  NORMAL {
    @Override
    public EntscheidungsgrenzenFuerAuffaelligkeit getEntscheidungsgrenzenFuerAuffaelligkeit() {
      double faktor = 1;
      return erzeugeEntscheidungsgrenzenFuerAuffaelligkeit(faktor);
    }
  },
  TOLERANT {
    @Override
    public EntscheidungsgrenzenFuerAuffaelligkeit getEntscheidungsgrenzenFuerAuffaelligkeit() {
      double faktor = 2;
      return erzeugeEntscheidungsgrenzenFuerAuffaelligkeit(faktor);
    }
  };

  EntscheidungsgrenzenFuerAuffaelligkeit erzeugeEntscheidungsgrenzenFuerAuffaelligkeit(double faktor) {
    return new EntscheidungsgrenzenFuerAuffaelligkeit(
        hoheAbweichungWahlbeteiligung * faktor,
        hoherWertFuerUngueltige * faktor,
        hoherUnterschiedZwischenStimmenNachStimmenartFuerDieGleichePolitischeGruppe * faktor,
        hoheAbweichungParteistimmen * faktor,
        hoechsteNeueAbweichungZuAlterAbweichungRatioBeiSichLohnenderParteistimmenvertausch * faktor,
        minimalerGuterGewinnBeiReduzierungDerAbweichung * faktor
    );
  }

  double hoheAbweichungWahlbeteiligung = .2;

  double hoherWertFuerUngueltige = .05;

  double hoherUnterschiedZwischenStimmenNachStimmenartFuerDieGleichePolitischeGruppe = .07;

  double hoheAbweichungParteistimmen = .02;

  double hoechsteNeueAbweichungZuAlterAbweichungRatioBeiSichLohnenderParteistimmenvertausch = .5;

  double minimalerGuterGewinnBeiReduzierungDerAbweichung = 1.5;

  public abstract EntscheidungsgrenzenFuerAuffaelligkeit getEntscheidungsgrenzenFuerAuffaelligkeit();
}
