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

import java.util.List;

import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonflikt;
import de.ivu.elect.business.ergebniskonflikt.entity.ListenAuswaehlenErgebnisKonfliktCustomData;
import de.ivu.elect.business.ergebniskonflikt.entity.ListenAuswaehlenTypisiertErgebnisKonfliktCustomData;
import de.ivu.elect.business.sitzberechnung.control.util.SitzberechnungProGebietHelper;
import de.ivu.elect.business.sitzberechnung.control.verteilung.ListenTeilnehmer;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;

public class ListenAuswaehlenErgebnisKonfliktBehandler
    extends
      AbstractVerteilungErgebnisKonfliktBehandler<Liste, ListenTeilnehmer> {

  private final Enum< ? > losentscheidTyp;
  private boolean isCustomDataTypisiert = false;

  public ListenAuswaehlenErgebnisKonfliktBehandler(SitzberechnungProGebietHelper helper, Enum< ? > losentscheidTyp) {
    super(helper);
    this.losentscheidTyp = losentscheidTyp;
  }

  /**
   * Wenn der ListenAuswaehlenErgebnisKonfliktBehandler typisiert ist, wird ggf. ein
   * {@link ListenAuswaehlenTypisiertErgebnisKonfliktCustomData} erzeugt, andernfalls ein
   * {@link ListenAuswaehlenErgebnisKonfliktCustomData}.
   */
  public ListenAuswaehlenErgebnisKonfliktBehandler setTypisiert() {
    this.isCustomDataTypisiert = true;
    return this;
  }

  @Override
  protected List<Liste> getGelosteTeilnehmerAusKonfliktBehandlung(List<Liste> teilnehmerAmLosverfahren,
      ErgebnisKonflikt geloesterKonflikt) {
    ListenAuswaehlenErgebnisKonfliktCustomData customData = geloesterKonflikt
        .getCustomData(ListenAuswaehlenErgebnisKonfliktCustomData.class);
    return customData.getGelosteListen(teilnehmerAmLosverfahren);
  }

  @Override
  protected ErgebnisKonflikt erzeugeKonflikt(List<Liste> listen, long anzahlZuLosen) {
    ListenAuswaehlenErgebnisKonfliktCustomData customData = isCustomDataTypisiert
        ? new ListenAuswaehlenTypisiertErgebnisKonfliktCustomData(losentscheidTyp)
        : new ListenAuswaehlenErgebnisKonfliktCustomData();
    return helper.createListenAuswahlKonflikt(customData, anzahlZuLosen, listen, losentscheidTyp);
  }

}
