package de.ivu.elect.business.sitzberechnung.control.wahlbeteiligung;

import java.util.List;

import de.ivu.elect.business.sitzberechnung.control.wahlbeteiligung.intern.WahlbeteiligungInObergebiet;
import de.ivu.elect.business.sitzberechnung.control.wahlbeteiligung.intern.WahlbeteiligungsgebietQueries;
import de.ivu.elect.business.sitzberechnung.control.wahlbeteiligung.intern.Wahlbeteiligungsparameter;

public enum BerechnungWahlbeteiligungMittelwertGewichtungsart {

  MATHEMATISCHER_DURCHSCHNITT {
    @Override
    public double berechneMittelwert(Wahlbeteiligungsparameter wahlbeteiligungsparameter, List<WahlbeteiligungInObergebiet> wahlbeteiligungUntergebiete, WahlbeteiligungsgebietQueries queries) {

      double zaehler = 0d;
      double nenner = 0d;

      if (wahlbeteiligungsparameter.getWahlbeteiligung() != 0) {
        zaehler += wahlbeteiligungsparameter.getWahlbeteiligung();
        nenner++;
      }

      for (WahlbeteiligungInObergebiet wahlbeteiligungInObergebiet : wahlbeteiligungUntergebiete) {
        if (wahlbeteiligungInObergebiet.getWahlbeteiligung() != 0) {
          zaehler += wahlbeteiligungInObergebiet.getWahlbeteiligung();
          nenner++;
        }
      }

      if (nenner != 0) {
        return zaehler / nenner;
      }
      return 0;
    }
  },

  GEWICHTUNG_NACH_WAHLBERECHTIGTE_INSGESAMT {
    @Override
    public double berechneMittelwert(Wahlbeteiligungsparameter wahlbeteiligungsparameter, List<WahlbeteiligungInObergebiet> wahlbeteiligungUntergebiete, WahlbeteiligungsgebietQueries queries) {

      double zaehler = 0d;
      double nenner = 0d;

      if (wahlbeteiligungsparameter.getWahlbeteiligung() != 0) {
        zaehler += wahlbeteiligungsparameter.getWahlbeteiligung() * wahlbeteiligungsparameter.getSummeWahlberechtigte();
        nenner += wahlbeteiligungsparameter.getSummeWahlberechtigte();
      }

      for (WahlbeteiligungInObergebiet wahlbeteiligungInObergebiet : wahlbeteiligungUntergebiete) {

        Long wahlberechtigteInsgesamt = queries.getGesamtanzahlWahlberechtigteRekursiv(wahlbeteiligungInObergebiet.getGemeinde());
        if (wahlbeteiligungInObergebiet.getWahlbeteiligung() != 0) {
          zaehler += (wahlbeteiligungInObergebiet.getWahlbeteiligung() * wahlberechtigteInsgesamt);
          nenner += wahlberechtigteInsgesamt;
        }
      }

      if (nenner != 0) {
        return zaehler / nenner;
      }
      return 0;
    }
  },

  GEWICHTUNG_NACH_AUSGEZAEHLTE_WAHLBERECHTIGTE {
    @Override
    public double berechneMittelwert(Wahlbeteiligungsparameter wahlbeteiligungsparameter, List<WahlbeteiligungInObergebiet> wahlbeteiligungUntergebiete, WahlbeteiligungsgebietQueries queries) {

      double zaehler = 0d;
      double nenner = 0d;

      if (wahlbeteiligungsparameter.getWahlbeteiligung() != 0) {
        zaehler += wahlbeteiligungsparameter.getWahlbeteiligung() * wahlbeteiligungsparameter.getSummeWahlberechtigteAusgezaehlt();
        nenner += wahlbeteiligungsparameter.getSummeWahlberechtigteAusgezaehlt();
      }

      for (WahlbeteiligungInObergebiet wahlbeteiligungInObergebiet : wahlbeteiligungUntergebiete) {
        Long ausgezaehlteWahlberechtigteInsgesamt = queries.getGesamtanzahlAusgezaehlteWahlberechtigteInsgesamtRekursiv(wahlbeteiligungInObergebiet.getGemeinde());
        if (wahlbeteiligungInObergebiet.getWahlbeteiligung() != 0) {
          zaehler += (wahlbeteiligungInObergebiet.getWahlbeteiligung() * ausgezaehlteWahlberechtigteInsgesamt);
          nenner += ausgezaehlteWahlberechtigteInsgesamt;
        }
      }

      if (nenner != 0) {
        return zaehler / nenner;
      }
      return 0;
    }
  };
    /*
    GEWICHTUNG_NACH_ANZAHL_AUSGEZAEHLTER_UNRNENWAHLGEBIETE,

    GEWICHTUNG_NACH_WAEHLER;
    */

  public abstract double berechneMittelwert(Wahlbeteiligungsparameter wahlbeteiligungsparameter, List<WahlbeteiligungInObergebiet> wahlbeteiligungUntergebiete, WahlbeteiligungsgebietQueries queries);

}
