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

import java.util.List;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;

/**
 * Um den {@link GewaehlteNachStimmenzahlErmittler} von Details der Persistierung und der Behandlung von
 * Stimmengleichheit frei zu halten, werden bestimmte Aufgaben an dieses Callback delegiert. Dies betrifft die
 * Entscheidungen bei Stimmengleichheit (per Los / Konfliktbehandlung) und die Erzeugung von {@link Gewaehlt}en.
 * 
 *
 */
public interface GewaehlteNachStimmenzahlErmittlerCallback<K extends Kandidatur> {

  /**
   * Ein {@link Gewaehlt}er kann erzeugt werden.
   * 
   * @param gewaehlt
   *          <code>true</code> bei Gewählten, <code>false</code> bei Nachrückern
   */
  void createGewaehlt(K kandidatur, boolean gewaehlt, long rang);

  /**
   * Bei den Kandidaturen, die sich mit gleicher Stimmenzahl um den letzten Sitz / die letzten Sitze bewerben,
   * entscheide, wer ihn bekommt.
   * 
   * @param unentschiedene
   *          die Kandidaten mit gleichem Anspruch auf den letzten Sitz / die letzten Sitze
   * @param anzahlZuLosen
   *          Anzahl der letzten Sitze, über die zu entscheiden ist
   * @return die Gewinner der Entscheidung
   */
  List<K> bestimmeLetzteGewaehlteBeiStimmengleichheit(List<K> unentschiedene, long anzahlZuLosen);

  /**
   * Zur Bestimmung der Reihenfolge der nicht Gewählten (= Nachrücker) bei jeweils gleichem Anspruch auf die nächst
   * höchste Position auf der Nachrückerliste
   * 
   * @param kandidaturen
   *          die Kandidaten mit gleichem Anspruch auf die nächsthöchste Position auf der Nachrückerliste
   * @return eine Liste von Listen von Kandidaturen. Gibt die Rangfolge der Kandidaturen auf der Nachrückerliste an,
   *         Kandidaturen mit gleichem Rang sind zusammen in einer Liste.
   * @see GewaehlteNachStimmenzahlErmittlerUtil#toListOfSingletonLists(List);
   */
  List<List<K>> bestimmeNachrueckerReihenfolge(List<K> kandidaturen);

}
