
package de.ivu.elect.sitzberechnung.verteilung.niemeyer;

import de.ivu.elect.sitzberechnung.math.Fraction;
import de.ivu.elect.sitzberechnung.verteilung.Teilnehmer;
import de.ivu.elect.sitzberechnung.verteilung.TeilnehmerErgebnis;

/**
 * Das Ergebnis der Verteilung nach Hare-Niemeyer für einen der Teilnehmer. Dieses beinhaltet die Anzahl Sitze aus Abrundung, Restsitzverteilung und (ggf. auf die Hare-Niemeyer-Verteilung folgend)
 * Losverfahren. Es ist Teil eines {@link HareNiemeyerErgebnis}es. Einzige spätere Modifikation (nach der eigentlichen Verteilung) kann durch Verteilung bei Restegleichheit (meist per Los) mit der
 * Methode {@link #entscheideLosverfahren(long)} erfolgen.
 */
public class HareNiemeyerTeilnehmerErgebnis extends TeilnehmerErgebnis {

  HareNiemeyerTeilnehmerErgebnis(Teilnehmer teilnehmer, Fraction divisor) {
    super(teilnehmer, divisor);
  }

  private HareNiemeyerTeilnehmerErgebnis(Teilnehmer teilnehmer) {
    super(teilnehmer);
  }

  public long getSitzeMaximal() {
    if (isEntschieden) {
      return getSitze();
    } else {
      // Könnte noch einen Sitz per Los gewinnen
      return getSitze() + 1;
    }
  }

  public long getSitzeMinimal() {
    return getSitze();
  }

  @Override
  protected void vergibRestsitz() {
    // Diese Methode gibt es nur, um zu verhindern, dass sie in der Oberklasse public sein muss.
    super.vergibRestsitz();
  }

  @Override
  protected void seiTeilnehmerAmLosverfahren() {
    // Diese Methode gibt es nur, um zu verhindern, dass sie in der Oberklasse public sein muss.
    super.seiTeilnehmerAmLosverfahren();
  }

  /**
   * @return Ergebnis eines Teilnehmers, wenn keine richtige Verteilung stattgefunden hat
   */
  static HareNiemeyerTeilnehmerErgebnis ohneVerteilung(Teilnehmer teilnehmer) {
    return new HareNiemeyerTeilnehmerErgebnis(teilnehmer);
  }
}
