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

import java.util.Collections;
import java.util.Comparator;

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;

public class AbstractDHondtQuotient<T extends TeilnehmerErgebnis> {

  public static final Comparator<AbstractDHondtQuotient< ? >> COMPARATOR_ASCENDING = (one, another) -> {
    int comparedByFraction = one.getFraction().compareTo(another.getFraction());

    if (comparedByFraction == 0) {
      return Long.compare(one.getZaehler(), another.getZaehler());
    }

    return comparedByFraction;
  };

  public static final Comparator<AbstractDHondtQuotient< ? >> COMPARATOR_DESCENDING = Collections.reverseOrder(COMPARATOR_ASCENDING);

  private final T teilnehmerErgebnis;

  private final long zaehler;

  private final long nenner;

  private final Fraction fraction;

  public AbstractDHondtQuotient(T teilnehmerErgebnis, long zaehler, long nenner) {
    super();

    this.teilnehmerErgebnis = teilnehmerErgebnis;

    this.zaehler = zaehler;
    this.nenner = nenner;
    this.fraction = zaehler == 0 || nenner == 0 ? Fraction.ZERO : Fraction.getFraction(zaehler, nenner);
  }

  public Teilnehmer getTeilnehmer() {
    return getTeilnehmerErgebnis().getTeilnehmer();
  }

  public T getTeilnehmerErgebnis() {
    return teilnehmerErgebnis;
  }

  public long getZaehler() {
    return zaehler;
  }

  public long getNenner() {
    return nenner;
  }

  public Fraction getFraction() {
    return fraction;
  }
}
