
package de.ivu.elect.business.ergebniskonflikt.entity;

import java.math.BigInteger;

import com.google.common.math.BigIntegerMath;

import de.ivu.elect.business.ergebniskonflikt.control.util.SublistList;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;

/**
 * CustomData für {@link ErgebnisKonflikt}e, bei dem aus {@link Liste}n ausgelost wird ohne Berücksichtigung der
 * Reihenfolge .
 */
public class ListenAuswaehlenErgebnisKonfliktCustomData extends AbstractListenErgebnisKonfliktCustomData {

  private static final long serialVersionUID = 4596917894680234801L;

  @Override
  public String getClassName() {
    return ListenAuswaehlenErgebnisKonfliktCustomData.class.getName();
  }

  /**
   * Sortiere die Listen nach dem PK und nimm die ersten davon
   */
  @Override
  public void loeseKonfliktAutomatisch() {
    setGelosteListenPks(waehleDieErstenAus(getAnzahlZuLosen(), getBeteiligteListenPKs()));
  }

  @Override
  public void loeseKonfliktAutomatisch(int indexDerLoesung) {
    setGelosteListenPks(new SublistList<>(asSortedList(getBeteiligteListenPKs()), (int) getAnzahlZuLosen())
        .get(indexDerLoesung));
  }

  @Override
  public void loeseKonfliktAutomatischZyklisch(int indexDerLoesung) {
    setGelosteListenPks(waehleZyklischAus(indexDerLoesung, getAnzahlZuLosen(), getBeteiligteListenPKs()));
  }

  @Override
  public BigInteger getAnzahlLoesungen() {
    return BigIntegerMath.binomial(getAnzahlZyklischerLoesungen(), (int) getAnzahlZuLosen());
  }

  @Override
  public int getAnzahlZyklischerLoesungen() {
    return getBeteiligteListenPKs().size();
  }

}
