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

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonflikt;
import de.ivu.elect.business.ergebniskonflikt.entity.SitzberechnungsalgorithmusOption;
import de.ivu.elect.business.ergebniskonflikt.entity.SitzberechnungsalgorithmusOptionContext;
import de.ivu.elect.business.ergebniskonflikt.entity.SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktCustomData;
import de.ivu.elect.business.ergebniskonflikt.entity.SitzberechnungsalgorithmusOptionenAuswaehlenTypisiertErgebnisKonfliktCustomData;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.sitzberechnung.control.util.SitzberechnungProGebietHelper;
import de.ivu.elect.business.sitzberechnung.control.verteilung.SitzberechnungsalgorithmusOptionTeilnehmer;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktBehandler<T extends SitzberechnungsalgorithmusOption<T>>
    extends
      AbstractVerteilungErgebnisKonfliktBehandler<T, SitzberechnungsalgorithmusOptionTeilnehmer<T>> {

  private final SitzberechnungsalgorithmusOptionContext<T> context;

  public SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktBehandler(SitzberechnungProGebietHelper helper, Enum< ? > losentscheidTyp, Collection<Gebiet> gebiete, Collection<Gruppe> gruppen,
      Collection<Wahlvorschlag> wahlvorschlaege, Collection<Kandidatur> kandidaturen, Collection<T> verfuegbareOptionen) {
    super(helper);

    this.context = new SitzberechnungsalgorithmusOptionContext<>(losentscheidTyp, gebiete, gruppen, wahlvorschlaege, kandidaturen, verfuegbareOptionen);
  }

  @Override
  protected ErgebnisKonflikt erzeugeKonflikt(List<T> beteiligteOptionen, long anzahlZuLosen) {
    SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktCustomData<T> customData = new SitzberechnungsalgorithmusOptionenAuswaehlenTypisiertErgebnisKonfliktCustomData<>();

    return helper.createSitzberechnungsalgorithmusOptionenAuswahlKonflikt(customData, context, anzahlZuLosen, beteiligteOptionen);
  }

  @Override
  protected List<T> getGelosteTeilnehmerAusKonfliktBehandlung(List<T> beteiligteOptionen, ErgebnisKonflikt geloesterKonflikt) {
    SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktCustomData<T> customData = geloesterKonflikt
        .getCustomData(SitzberechnungsalgorithmusOptionenAuswaehlenErgebnisKonfliktCustomData.class);

    return new ArrayList<>(customData.extractGelosteOptionen(beteiligteOptionen));
  }
}
