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

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

import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;

public class ZufaelligeReferendumStimmenAnteileNormalverteilungKonfiguration {
  private static final double GUELTIGE_STIMMENANTEIL_MEAN = 0.97;
  private static final double GUELTIGE_STIMMENANTEIL_STANDARD_DEVIATION = 0.01;
  private static final double GUELTIGE_STIMMENANTEIL_MIN = 0.85;

  private static final double REFERENDUM_STIMME_MEAN = 0.5;
  private static final double REFERENDUM_STIMME_STANDARD_DEVIATION = 0.15;
  // kann aber nach Wunsch konfiguriert werden

  private static final double MINDEST_VERHAELTNIS_WAHLBETEILIGUNG_ZU_QUORUM = 1.5;

  private final NormalDistribution normalDistributionFuerGultigeStimmenanteil;
  private final NormalDistribution normalDistributionPerReferendumOption;

  public ZufaelligeReferendumStimmenAnteileNormalverteilungKonfiguration(RandomGenerator randomGenerator) {
    this.normalDistributionFuerGultigeStimmenanteil = new NormalDistribution(randomGenerator, GUELTIGE_STIMMENANTEIL_MEAN, GUELTIGE_STIMMENANTEIL_STANDARD_DEVIATION);
    this.normalDistributionPerReferendumOption =  new NormalDistribution(randomGenerator, REFERENDUM_STIMME_MEAN, REFERENDUM_STIMME_STANDARD_DEVIATION);
  }

  public NormalDistribution getNormalDistributionPerReferendumOption(ReferendumOption referendumOption) {
    return normalDistributionPerReferendumOption;
  }

  public NormalDistribution getNormalDistributionFuerGultigeStimmenanteil() {
    return normalDistributionFuerGultigeStimmenanteil;
  }

  public double getMindestVerhaeltnisWahlbeteiligungZuQuorum() {
    // eine 1.5 heisst z. B., dass die Wahlbeteiligung mindestens 1.5 * Quorum sein muss
    return MINDEST_VERHAELTNIS_WAHLBETEILIGUNG_ZU_QUORUM;
  }

  public double getGueltigeStimmenanteilMin() {
    return GUELTIGE_STIMMENANTEIL_MIN;
  }
}
