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

import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungsergebnis;

/**
 * Interface zum internen Gebrauch in der Sitzberechnung. Es muss von jedem Kern-Sitzberechnung implementiert werden. Die Methode {@link #fuehreSitzberechnungDurch(Sitzberechnungseingabe)} des
 * Kern-Algorithmus wird ggf. auch mehrfach von einem Variantenberechner aufgerufen.
 *
 * @see Sitzberechnungsalgorithmus#berechneSitzverteilung(Sitzberechnungseingabe)
 *
 */
public interface Sitzberechnung<Konfiguration extends SitzberechnungsalgorithmusKonfiguration> {

  /**
   * Führt die eigentliche Sitzberechnung durch.
   *
   * @param sitzberechnungseingabe
   *          Alle für die Sitzberechnung erforderlichen Daten
   * @return das Ergebnis der Sitzberechnung (Anzahl Sitze, Gewählte, ErgebnisKonflikte, Protokoll)
   */
  Sitzberechnungsergebnis fuehreSitzberechnungDurch(Sitzberechnungseingabe<Konfiguration> sitzberechnungseingabe);
}
