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

import java.util.Map;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.hochrechnung.entity.GebietDaten;
import de.ivu.elect.business.hochrechnung.entity.WahlteilnehmerAnzahl;

public class RelativeGroesseZwischenZweiGebietenAnhandGesamtWaehlerAnzahl implements RelativeGroesseZwischenZweiGebietenBestimmer{

  private final Map<Gebiet, GebietDaten<Long>> primaereWahl;
  private final Map<Gebiet, GebietDaten<Long>> sekondaereWahl;

  public RelativeGroesseZwischenZweiGebietenAnhandGesamtWaehlerAnzahl(Map<Gebiet, GebietDaten<Long>> primaereWahl, Map<Gebiet, GebietDaten<Long>> sekondaereWahl) {
    this.primaereWahl = primaereWahl;
    this.sekondaereWahl = sekondaereWahl;
  }

  @Override
  public Double getRelativeGroesseZwischenZweiGebietenBestimmer(Gebiet gebiet, Gebiet zuGebiet) {
    if (gebiet == null || zuGebiet == null) {
      return null;
    }
    Double relativeGroesseZwischenZweiGebietenAnhandPrimaereWahl = getRelativeGroesseZwischenZweiGebietenAnhandPrimaereWahl(gebiet, zuGebiet);
    if (relativeGroesseZwischenZweiGebietenAnhandPrimaereWahl != null && relativeGroesseZwischenZweiGebietenAnhandPrimaereWahl != 0) {
      return relativeGroesseZwischenZweiGebietenAnhandPrimaereWahl;
    }
    Double relativeGroesseZwischenZweiGebietenAnhandSekondaereWahl = getRelativeGroesseZwischenZweiGebietenAnhandSekondaereWahl(gebiet, zuGebiet);
    if (relativeGroesseZwischenZweiGebietenAnhandSekondaereWahl != null && relativeGroesseZwischenZweiGebietenAnhandSekondaereWahl != 0) {
      return relativeGroesseZwischenZweiGebietenAnhandSekondaereWahl;
    }
    return null;
  }

  private Double getRelativeGroesseZwischenZweiGebietenAnhandSekondaereWahl(Gebiet gebiet, Gebiet zuGebiet) {
    return getRelativeGroesseZwischenZweiGebietenAnhandWahl(gebiet, zuGebiet, sekondaereWahl);
  }

  private Double getRelativeGroesseZwischenZweiGebietenAnhandPrimaereWahl(Gebiet gebiet, Gebiet zuGebiet) {
    return getRelativeGroesseZwischenZweiGebietenAnhandWahl(gebiet, zuGebiet, primaereWahl);
  }

  private Double getRelativeGroesseZwischenZweiGebietenAnhandWahl(Gebiet gebiet, Gebiet zuGebiet, Map<Gebiet, GebietDaten<Long>> wahl) {
    if (wahl == null) {
      return null;
    }
    GebietDaten<Long> gebietDaten1 = wahl.get(gebiet);
    GebietDaten<Long> gebietDaten2 = wahl.get(zuGebiet);
    if (gebietDaten1 == null || gebietDaten2 == null) {
      return null;
    }
    WahlteilnehmerAnzahl anzahlWaehlerImGebiet1 = gebietDaten1.getAnzahlWaehlerImGebiet();
    WahlteilnehmerAnzahl anzahlWaehlerImGebiet2 = gebietDaten2.getAnzahlWaehlerImGebiet();
    if (anzahlWaehlerImGebiet1 == null || anzahlWaehlerImGebiet2 == null) {
      return null;
    }
    Long gesamtAnzahlWaehlerImGebiet1 = anzahlWaehlerImGebiet1.getGesamtNotNull();
    Long gesamtAnzahlWaehlerImGebiet2 = anzahlWaehlerImGebiet2.getGesamtNotNull();
    if (gesamtAnzahlWaehlerImGebiet1 == null || gesamtAnzahlWaehlerImGebiet2 == null || gesamtAnzahlWaehlerImGebiet2 == 0L) {
      return null;
    }
    return 1.0 * gesamtAnzahlWaehlerImGebiet1 / gesamtAnzahlWaehlerImGebiet2;
  }
}
