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

import java.util.List;

import de.ivu.elect.business.gebietsbaum.entity.AbstractGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.sitzberechnung.control.wahlneutral.AbstractDirektwahlSitzberechnungsalgorithmusInternal;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;

/**
 * Allgemeiner Sitzverteilungsalgorithmus für eine Direktwahl mit einfachem Mehrheitswahlrecht in jedem
 * Direktwahlgebiet. Wer die meisten Stimmen hat, ist gewählt. Sind keine Stimmen abgegeben, dann ist niemand gewählt.
 * Haben mehrere Kandidaten die meisten Stimmen, dann wird unter ihnen gelost.
 */
public class StandardDirektwahlSitzberechnungsalgorithmusInternal
    extends
      AbstractDirektwahlSitzberechnungsalgorithmusInternal<SitzberechnungsalgorithmusKonfiguration> {

  private final boolean sitzeVergeben;

  public StandardDirektwahlSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe, boolean sitzeVergeben) {
    super(sitzberechnungseingabe);
    this.sitzeVergeben = sitzeVergeben;
  }

  @Override
  public boolean isMitSitzeErzeugung() {
    return sitzeVergeben;
  }

  @Override
  protected Wahldurchfuehrungsgebiet getWahlgebiet(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return sitzberechnungseingabe.getStimmergebnisDaten().getWurzelgebiet();
  }

  @Override
  public List<Wahldurchfuehrungsgebiet> bestimmeDirektkandidatenGebiete() {
    return helper.getStimmergebnisDaten().getGebiete(AbstractGebiet::isDirektwahlgebiet);
  }

  @Override
  protected Enum< ? > getLosentscheidTypFuerAuswahlKonflikt() {
    return StandardDirektwahlLosentscheidTyp.STIMMENGLEICHHEIT;
  }

}
