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

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.Wahlgang;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.presentation.kandidatur.table.KandidaturGewaehltKeinSitzberechnungsalgorithmusColumnBuilder;
import de.ivu.elect.presentation.kandidatur.table.KandidaturGewaehltSitzberechnungsalgorithmusColumnBuilder;

/**
 * Subklasse von AbstractSitzberechnungsalgorithmus mit den am meisten verwendeten "Voreinstellungen":
 * <ul>
 * <li>SitzberechnungsalgorithmusKonfiguration als Konfig-Klasse</li>
 * <li>Es wird berechnet, Sitze und Gewählte markiert</li>
 * <li>Verwendet den Variantenberechner</li>
 * <li>getWaehlerBenannteWahlvorschlaegeGebietFuerErfassungsgebiet() wird nicht unterstützt</li>
 * <li>der übliche KandidaturGewaehltSitzberechnungsalgorithmusColumnBuilder</li>
 * </ul>
 */
public abstract class LessAbstractSitzberechnungsalgorithmus extends AbstractSitzberechnungsalgorithmus<SitzberechnungsalgorithmusKonfiguration>
    implements
      Sitzberechnung<SitzberechnungsalgorithmusKonfiguration> {

  private static final long serialVersionUID = 1L;

  protected LessAbstractSitzberechnungsalgorithmus() {
    super();
  }

  public boolean isErsterWahlgang(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return getWahlgang(sitzberechnungseingabe).isErsterWahlgang();
  }

  public boolean isStichwahl(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return getWahlgang(sitzberechnungseingabe).isStichwahl();
  }

  public boolean isWiederholungswahl(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return getWahlgang(sitzberechnungseingabe).isWiederholungswahl();
  }

  private Wahlgang getWahlgang(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return sitzberechnungseingabe.getStimmergebnisDaten().getWahl().getWahlgang();
  }

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

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

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

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

  /**
   * Muss z.B. bei Direktwahlen überschrieben werden
   */
  @Override
  public boolean isVergibtSitze() {
    return true;
  }
}
