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

import de.ivu.elect.business.sitzberechnung.control.direktwahl.StandardDirektwahlMitQuorumSitzberechnungsalgorithmusInternal;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;
import de.ivu.elect.business.wahl.entity.WahlartSitzberechnungsalgorithmus;

/**
 * A.k.a. "Standardvariante mit Quorum"...
 *
 * "Vorgesehen sind maximal zwei Wahlgänge. Jeder Wähler hat eine Stimme. Gewählt ist im ersten Wahlgang, wer über 50 Prozent der Stimmen erhalten hat, sofern diese Mehrheit mindestens XX vom Hundert
 * der wahlberechtigten Personen umfasst (Quorum). Wurde dies von niemanden geschafft, findet ein zweiter Wahlgang statt, an dem die beiden Stimmenstärksten des ersten Wahlgangs teilnehmen. Bei
 * Stimmengleichheit entscheidet das Los darüber, wer für den zweiten Wahlgang zugelassen wird. Gewählt ist im zweiten Wahlgang, wer die meisten Stimmen (und demnach automatisch über 50 Prozent der
 * Stimmen) erhalten hat, sofern diese Mehrheit mindestens XX vom Hundert der wahlberechtigten Personen umfasst (Quorum). Bei Stimmengleichheit entscheidet das Los darüber, wer gewählt ist."
 *
 * @see https://bravors.brandenburg.de/gesetze/bbgkwahlg#72
 *
 * @see StandardDirektwahlSitzberechnungsalgorithmus (a.k.a. "relative Mehrheitswahl")
 * @see AbsoluteMehrheitswahlSitzberechnungsalgorithmus
 */
public class AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmus extends AbstractAbsoluteMehrheitswahlSitzberechnungsalgorithmus {

  private static final long serialVersionUID = 1L;

  public AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmus() {
    super();
  }

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

  @Override
  protected AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmusInternal getAbsoluteMehrheitSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return new AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmusInternal(this, sitzberechnungseingabe);
  }

  @Override
  protected StandardDirektwahlMitQuorumSitzberechnungsalgorithmusInternal getRelativeMehrheitSitzberechnungsalgorithmusInternal(
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    return new StandardDirektwahlMitQuorumSitzberechnungsalgorithmusInternal(sitzberechnungseingabe, isVergibtSitze());
  }
}
