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

import de.ivu.elect.business.sitzberechnung.control.Sitzberechnungsalgorithmus;
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)
   */
  public Sitzberechnungsergebnis fuehreSitzberechnungDurch(Sitzberechnungseingabe<Konfiguration> sitzberechnungseingabe);
}
