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

import static java.util.stream.Collectors.toList;

import java.util.List;

import de.ivu.elect.business.gebietsbaum.control.GebietByPositionComparator;
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;

/**
 * Einfache Bestimmung der Direktkandidaten in den Wahlkreisen (= Direktkandidaten-Gebieten). Nur der Kandidat mit der
 * jeweils höchsten Stimmenzahl gewinnt. Es gibt keine Nachrücker.
 */
public class BTWSitzberechnungsalgorithmusInternal
    extends
    AbstractDirektwahlSitzberechnungsalgorithmusInternal<SitzberechnungsalgorithmusKonfiguration> {

  protected BTWSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    super(sitzberechnungseingabe);
  }

  @Override
  protected Wahldurchfuehrungsgebiet getWahlgebiet(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return sitzberechnungseingabe.getStimmergebnisDaten().getWurzelgebiet(); // Bis zum Beweis des Gegenteils...
  }

  @Override
  protected List<Wahldurchfuehrungsgebiet> bestimmeDirektkandidatenGebiete() {
    return helper.getStimmergebnisDaten().getGebiete().stream()
        .filter(Wahldurchfuehrungsgebiet::isDirektwahlgebiet)
        .sorted(new GebietByPositionComparator()::compare).collect(toList());
  }

  @Override
  protected Enum<?> getLosentscheidTypFuerAuswahlKonflikt() {
    return BTWLosentscheidTyp.STIMMENGLEICHHEIT_VON_DIREKTKANDIDATEN;
  }

}
