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


/**
 * Utility-Klasse zum Sortieren und Gruppieren von Kandidaten (oder Listen oder anderen Objekten) vom Typ V nach deren
 * Stimmenzahl
 * <p/>
 * Benutzung:
 * 
 * <pre>
 * NachStimmenSortierer&lt;V&gt; sortierer = new NachStimmenSortierer&lt;&gt;();
 * for (V v : listOfVs) {
 *   sortierer.add(v, getVotes(v));
 * }
 * System.out.println(&quot;Gewonnen haben: &quot; + sortierer.getErstplatzierte());
 * </pre>
 * 
 *
 * @see VordereInRangfolgeErmittler
 * @param <V>
 */
public class NachStimmenSortierer<V> extends NachNummerSortierer<V, Long> {

  private long gesamtzahlStimmen = 0;

  public NachStimmenSortierer() {
    super();
  }

  public NachStimmenSortierer(int anzahlSitze) {
    super(anzahlSitze);
  }

  public void add(long stimmen, V kandidatur) {
    if (stimmen < 0) {
      throw new IllegalArgumentException("Stimmenzahlen dürfen nicht negativ sein");
    }
    gesamtzahlStimmen += stimmen;
    super.add(stimmen, kandidatur);
  }

  /**
   * @return <code>true</code> wenn keine Kandidaten vorhanden sind oder alle Kandidaten die Stimmenzahl 0 haben
   */
  public boolean isAlleStimmenNull() {
    return isEmpty() || getHoechsteStimmenzahl() == 0;
  }

  /**
   * Diese Bedingung impliziert, dass es einen eindeutigen Sieger gibt, der mindestens eine Stimme hat
   * 
   * @return <code>true</code>, wenn der Erstplatzierte mehr als die Hälfte der Stimmen hat
   */
  public boolean hatWahlsiegerAbsoluteMehrheit() {
    return !isEmpty() && getHoechsteStimmenzahl() >= getAbsoluteMehrheit();
  }

  public long getAbsoluteMehrheit() {
    return gesamtzahlStimmen / 2 + 1;
  }

  @Override
  public String toString() {
    return super.toString() + ": anzahl Stimmen = " + gesamtzahlStimmen + ", map = " + map;
  }

}
