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

import java.util.HashSet;
import java.util.Set;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;

public class GebietDatenWahlbeteiligung extends WahlteilnehmerInfo<Double> {

  public GebietDatenWahlbeteiligung() {
    super();
  }

  public GebietDatenWahlbeteiligung(WahlteilnehmerAnzahl wahlberechtigte, WahlteilnehmerAnzahl waehler) {
    super();
    Set<Stimmenart> stimmenarten = new HashSet<>(waehler.map.keySet());
    stimmenarten.addAll(wahlberechtigte.map.keySet());
    for (Stimmenart stimmenart: stimmenarten) {
      setAnzahl(stimmenart, berechneWahlbeteiligung(stimmenart, wahlberechtigte, waehler));
    }
    if (!map.containsKey(Stimmenart.GESAMT)) {
      setAnzahl(Stimmenart.GESAMT, divide(waehler.getGesamtNotNull(), wahlberechtigte.getGesamtNotNull()));
    }
  }

  private Double berechneWahlbeteiligung(Stimmenart stimmenart, WahlteilnehmerAnzahl wahlberechtigte, WahlteilnehmerAnzahl waehler) {
    return divide(waehler.getAnzahlNotNull(stimmenart), wahlberechtigte.getAnzahlNotNull(stimmenart));
  }

  private Double divide(long zaehler, long nenner) {
    if (nenner == 0 || zaehler == 0) {
      return null;
    }
    return 1.0 * zaehler / nenner;
  }

  @Override
  public Double getZero() {
    return 0D;
  }
}