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

import javax.annotation.Nullable;

import de.ivu.elect.business.sitzberechnung.control.util.Fraction;
import de.ivu.elect.business.sitzberechnung.control.verteilung.Teilnehmer;
import de.ivu.elect.business.sitzberechnung.control.verteilung.TeilnehmerErgebnis;

/**
 * Das Ergebnis einer Weiterverteilung nach D'Hondt für einen der Teilnehmer. Dieses beinhaltet KEINE Sitze aus
 * Abrundung, sondern nur,Restsitzverteilung und gleichen Quotienten ggf. Losverfahren. Es ist Teil eines
 * {@link DHondtWeiterverteilungErgebnis}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 DHondtWeiterverteilungTeilnehmerErgebnis extends TeilnehmerErgebnis {

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

  protected DHondtWeiterverteilungTeilnehmerErgebnis(Teilnehmer teilnehmer) {
    super(teilnehmer);
  }

  public Fraction getNaechsterQuotient() {
    return Fraction.getFraction(teilnehmer.getStimmen(), getSitzeGesamt() + 1);
  }

  public @Nullable Fraction getLetzterQuotient() {
    if (getSitze() > 0) {
      return Fraction.getFraction(teilnehmer.getStimmen(), getSitzeGesamt());
    } else {
      return null;
    }
  }

  /**
   * @return sitzeVorab plus die bei der Weiterverteilung gewonnenen Sitze
   */
  public long getSitzeGesamt() {
    return getSitzeVorab() + getSitze();
  }

  public long getSitzeVorab() {
    return getTeilnehmer().getSitzeVorab();
  }

  /**
   * @return die bei der Weiterverteilung gewonnenen Sitze, also OHNE die sitzeVorab
   */
  public long getSitze() {
    return super.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();
  }
}
