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

import de.ivu.elect.business.sitzberechnung.control.AbstractSitzberechnungsalgorithmus;
import de.ivu.elect.business.sitzberechnung.control.varianten.Sitzberechnung;
import de.ivu.elect.business.sitzberechnung.control.varianten.Variantenberechner;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungsergebnis;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlartSitzberechnungsalgorithmus;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.presentation.kandidatur.table.KandidaturGewaehltNachSitzberechnungsalgorithmusColumnBuilder;
import de.ivu.elect.presentation.kandidatur.table.KandidaturGewaehltSitzberechnungsalgorithmusColumnBuilder;

/**
 * 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 BTWSitzberechnungsalgorithmus extends AbstractSitzberechnungsalgorithmus<SitzberechnungsalgorithmusKonfiguration> implements Sitzberechnung<SitzberechnungsalgorithmusKonfiguration> {

  private static final long serialVersionUID = 1L;

  public BTWSitzberechnungsalgorithmus() {
    super();
  }

  @Override
  public boolean isDefaultFuerWahlart(Wahl wahl) {
    return CommonWahlart.BUNDESTAGSWAHL.equalsWahlart(wahl);
  }

  @Override
  public WahlartSitzberechnungsalgorithmus getSitzberechnungsalgorithmusEnum() {
    return WahlartSitzberechnungsalgorithmus.ELECT_BUNDESTAGSWAHL;
  }

  @Override
  public Sitzberechnungsergebnis berechneSitzverteilung(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return new Variantenberechner<>(this).fuehreSitzberechnungDurch(sitzberechnungseingabe);
  }

  @Override
  public Sitzberechnungsergebnis fuehreSitzberechnungDurch(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return new BTWSitzberechnungsalgorithmusInternal(sitzberechnungseingabe).berechneSitzverteilung();
  }

  @Override
  public SitzberechnungsalgorithmusKonfiguration getDefaultKonfiguration() {
    return new SitzberechnungsalgorithmusKonfiguration();
  }

  @Override
  public KandidaturGewaehltSitzberechnungsalgorithmusColumnBuilder getKandidaturGewaehltColumnBuilder(Messages messages, Icons icons) {
    return new KandidaturGewaehltNachSitzberechnungsalgorithmusColumnBuilder(messages, icons);
  }

  @Override
  public boolean isBerechnetErgebnis() {
    return true;
  }

  @Override
  public boolean isVergibtSitze() {
    return false;
  }
}
