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

import org.apache.commons.math3.distribution.NormalDistribution;
import org.apache.commons.math3.random.RandomGenerator;

public class ZufaelligeWahlbeteiligungNormalverteilungKonfiguration {
  // Diese Konstante Zahlen orientieren sich an de.ivu.elect.business.stimmeingabe.control.fiktive.WahlberechtigteUndWaehlerStimmeingabenAusFiktivwertenSetzer

  private static final double WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_MEAN = .5;
  private static final double WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_STANDARD_DEVIATION = .1;
  private static final double WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_MIN_PREVENTING_ZEROS = .15;

  private static final double WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_MEAN = 0.02;
  private static final double WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_STANDARD_DEVIATION = 0.005;
  private static final double WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_MIN_PREVENTING_ZEROS = .02;

  private static final double WAHLBETEILIGUNG_NICHT_IM_WAEHLEVERZEICHNIS_URNENWAHL_MEAN = .5;
  private static final double WAHLBETEILIGUNG_NICHT_IM_WAEHLEVERZEICHNIS_URNENWAHL_STANDARD_DEVIATION = .1;

  private static final double WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_MEAN = .90;
  private static final double WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_STANDARD_DEVIATION = .05;
  private static final double WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_MIN_PREVENTING_ZEROS = .2;

  private final NormalDistribution normalDistributionFuerWahlbeteiligungOhneWahlscheinUrnenwahl;
  private final NormalDistribution normalDistributionFuerWahlbeteiligungMitWahlscheinUrnenwahl;
  private final NormalDistribution normalDistributionFuerWahlbeteiligungNichtImWaehleverzeichnisUrnenwahl;

  private final NormalDistribution normalDistributionFuerWahlbeteiligungGesamtBriefwahl;

  public ZufaelligeWahlbeteiligungNormalverteilungKonfiguration(RandomGenerator randomGenerator) {
    this.normalDistributionFuerWahlbeteiligungOhneWahlscheinUrnenwahl = new NormalDistribution(randomGenerator, getWahlbeteiligungOhneWahlscheinUrnenwahlMean(), getWahlbeteiligungOhneWahlscheinUrnenwahlStandardDeviation());
    this.normalDistributionFuerWahlbeteiligungMitWahlscheinUrnenwahl = new NormalDistribution(randomGenerator, getWahlbeteiligungMitWahlscheinUrnenwahlMean(), getWahlbeteiligungMitWahlscheinUrnenwahlStandardDeviation());
    this.normalDistributionFuerWahlbeteiligungNichtImWaehleverzeichnisUrnenwahl = new NormalDistribution(randomGenerator, getWahlbeteiligungNichtImWaehleverzeichnisUrnenwahlMean(), getWahlbeteiligungNichtImWaehleverzeichnisUrnenwahlStandardDeviation());

    this.normalDistributionFuerWahlbeteiligungGesamtBriefwahl = new NormalDistribution(randomGenerator, getWahlbeteiligungGesamtBriefwahlMean(), getWahlbeteiligungGesamtBriefwahlStandardDeviation());
  }

  private double getWahlbeteiligungOhneWahlscheinUrnenwahlMean() {
    return WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_MEAN;
  }

  private double getWahlbeteiligungOhneWahlscheinUrnenwahlStandardDeviation() {
    return WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_STANDARD_DEVIATION;
  }

  private double getWahlbeteiligungMitWahlscheinUrnenwahlMean() {
    return WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_MEAN;
  }

  private double getWahlbeteiligungMitWahlscheinUrnenwahlStandardDeviation() {
    return WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_STANDARD_DEVIATION;
  }

  private static double getWahlbeteiligungNichtImWaehleverzeichnisUrnenwahlMean() {
    return WAHLBETEILIGUNG_NICHT_IM_WAEHLEVERZEICHNIS_URNENWAHL_MEAN;
  }

  private static double getWahlbeteiligungNichtImWaehleverzeichnisUrnenwahlStandardDeviation() {
    return WAHLBETEILIGUNG_NICHT_IM_WAEHLEVERZEICHNIS_URNENWAHL_STANDARD_DEVIATION;
  }

  private double getWahlbeteiligungGesamtBriefwahlMean() {
    return WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_MEAN;
  }

  private double getWahlbeteiligungGesamtBriefwahlStandardDeviation() {
    return WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_STANDARD_DEVIATION;
  }

  public NormalDistribution getNormalDistributionFuerWahlbeteiligungOhneWahlscheinUrnenwahl() {
    return normalDistributionFuerWahlbeteiligungOhneWahlscheinUrnenwahl;
  }

  public NormalDistribution getNormalDistributionFuerWahlbeteiligungMitWahlscheinUrnenwahl() {
    return normalDistributionFuerWahlbeteiligungMitWahlscheinUrnenwahl;
  }

  public NormalDistribution getNormalDistributionFuerWahlbeteiligungNichtImWaehleverzeichnisUrnenwahl() {
    return normalDistributionFuerWahlbeteiligungNichtImWaehleverzeichnisUrnenwahl;
  }

  public NormalDistribution getNormalDistributionFuerWahlbeteiligungGesamtBriefwahl() {
    return normalDistributionFuerWahlbeteiligungGesamtBriefwahl;
  }

  public static double getWahlbeteiligungOhneWahlscheinUrnenwahlMinPreventingZeros() {
    return WAHLBETEILIGUNG_OHNE_WAHLSCHEIN_URNENWAHL_MIN_PREVENTING_ZEROS;
  }

  public static double getWahlbeteiligungMitWahlscheinUrnenwahlMinPreventingZeros() {
    return WAHLBETEILIGUNG_MIT_WAHLSCHEIN_URNENWAHL_MIN_PREVENTING_ZEROS;
  }

  public static double getWahlbeteiligungGesamtBriefwahlMinPreventingZeros() {
    return WAHLBETEILIGUNG_GESAMT_BRIEFWAHL_MIN_PREVENTING_ZEROS;
  }
}
