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

import de.ivu.elect.business.sitzberechnung.control.LessAbstractSitzberechnungsalgorithmus;
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;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungsergebnis;

public abstract class AbstractAbsoluteMehrheitswahlSitzberechnungsalgorithmus extends LessAbstractSitzberechnungsalgorithmus {

  private static final long serialVersionUID = 1L;

  protected AbstractAbsoluteMehrheitswahlSitzberechnungsalgorithmus() {
    super();
  }

  @Override
  public Sitzberechnungsergebnis fuehreSitzberechnungDurch(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    if (isStichwahl(sitzberechnungseingabe)) { // ELECTKOM-828, anderes Verhalten bei Stimmengleichheit erforderlich...
      return getRelativeMehrheitSitzberechnungsalgorithmusInternal(sitzberechnungseingabe).berechneSitzverteilung();
    }

    return getAbsoluteMehrheitSitzberechnungsalgorithmusInternal(sitzberechnungseingabe).berechneSitzverteilung();
  }

  protected boolean isErstplatzierteUnentschiedenErfordertWiederholungswahl(Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return isErsterWahlgang(sitzberechnungseingabe) && isErsterWahlgangErstplatzierteUnentschiedenErfordertWiederholungswahl()
        || isStichwahl(sitzberechnungseingabe) && isStichwahlErstplatzierteUnentschiedenErfordertWiederholungswahl();
  }

  protected boolean isErsterWahlgangErstplatzierteUnentschiedenErfordertWiederholungswahl() {
    return false; // ELECT-14200
  }

  protected boolean isStichwahlErstplatzierteUnentschiedenErfordertWiederholungswahl() {
    return false;
  }

  protected abstract AbstractAbsoluteMehrheitswahlSitzberechnungsalgorithmusInternal getAbsoluteMehrheitSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe);

  protected abstract AbstractDirektwahlSitzberechnungsalgorithmusInternal<SitzberechnungsalgorithmusKonfiguration> getRelativeMehrheitSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe);

  @Override
  public boolean isVergibtSitze() {
    return false; // Idealerweise EIN Sieger...
  }

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