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

import java.util.Set;
import java.util.function.Supplier;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.UmgangHinterlegteAWerte;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;

public class ErgebnisDatenWahlberechtigteAktuelleWahlAusGebieten extends AbstractErgebnisDatenWahlberechtigte {

  private final StimmergebnisDaten stimmergebnisDaten;

  private final boolean ermittleStimmenNurAnhandErfassungsgebiete;

  public ErgebnisDatenWahlberechtigteAktuelleWahlAusGebieten(StimmergebnisDaten stimmergebnisDaten, Supplier<Set<Gebiet>> erfassteGebiete, StimmenKumulierer stimmenKumulierer,
      StimmenPool stimmenPool) {
    super(stimmergebnisDaten::getUntergeordneteGebiete, erfassteGebiete, stimmenKumulierer, stimmenPool);

    this.stimmergebnisDaten = stimmergebnisDaten;

    UmgangHinterlegteAWerte umgangHinterlegteAWerte = stimmergebnisDaten.getWahlParameterLoader().resolveEnumValue(stimmergebnisDaten.getWahl(), WahlParameterWerte.UMGANG_AWERTE_HINTERLEGT,
        UmgangHinterlegteAWerte.class);

    this.ermittleStimmenNurAnhandErfassungsgebiete = umgangHinterlegteAWerte == null || umgangHinterlegteAWerte.isErfassungMoeglichNurFuerErfassungsgebiete();
  }

  @Override
  public boolean isErmittleStimmenNurAnhandErfassungsgebiete() {
    return ermittleStimmenNurAnhandErfassungsgebiete;
  }

  @Override
  public Long ermittleStimmen(Stimmenart stimmenart, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    // ELECTKOM-121, Zugriff auf die A-Werte vereinheitlichen.
    if (Stimmenart.OHNE_WAHLSCHEIN.equals(stimmenart)) {
      return stimmergebnisDaten.getWahlberechtigteOhneWahlscheinFuerErfassungsgebietUnterhalbVonAnzahl(wahldurchfuehrungsgebiet);
    }

    if (Stimmenart.MIT_WAHLSCHEIN.equals(stimmenart)) {
      return stimmergebnisDaten.getWahlberechtigteMitWahlscheinFuerErfassungsgebietUnterhalbVonAnzahl(wahldurchfuehrungsgebiet);
    }

    if (Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS.equals(stimmenart)) {
      return stimmergebnisDaten.getWahlberechtigteNichtImWaehlerverzeichnisFuerErfassungsgebietUnterhalbVonAnzahl(wahldurchfuehrungsgebiet);
    }

    if (Stimmenart.GESAMT.equals(stimmenart)) {
      return stimmergebnisDaten.getWahlberechtigteGesamtFuerErfassungsgebietUnterhalbVonAnzahlGesamt(wahldurchfuehrungsgebiet);
    }

    return getStimmenKumulierer().getSummeWahlberechtigteStimmenAufGebiet(getStimmenPool(), wahldurchfuehrungsgebiet, stimmenart);
  }
}
