
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.GebieteAuswaehlenErgebnisKonfliktCustomData;
import de.ivu.elect.business.ergebniskonflikt.entity.GebieteAuswaehlenTypisiertErgebnisKonfliktCustomData;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.sitzberechnung.control.util.SitzberechnungProGebietHelper;
import de.ivu.elect.business.sitzberechnung.control.verteilung.WahldurchfuehrungsgebietTeilnehmer;

public class GebieteAuswaehlenErgebnisKonfliktBehandler
    extends
      AbstractVerteilungsErgebnisKonfliktBehandler<Wahldurchfuehrungsgebiet, WahldurchfuehrungsgebietTeilnehmer> {

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

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

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

  @Override
  protected List<Wahldurchfuehrungsgebiet> getGelosteTeilnehmerAusKonfliktBehandlung(
      List<Wahldurchfuehrungsgebiet> teilnehmerAmLosverfahren, ErgebnisKonflikt geloesterKonflikt) {
    GebieteAuswaehlenErgebnisKonfliktCustomData customData = geloesterKonflikt
        .getCustomData(GebieteAuswaehlenErgebnisKonfliktCustomData.class);
    return customData.getGelosteGebiete(teilnehmerAmLosverfahren);
  }

  @Override
  protected ErgebnisKonflikt erzeugeKonflikt(List<Wahldurchfuehrungsgebiet> gebiete, long anzahlZuLosen) {
    GebieteAuswaehlenErgebnisKonfliktCustomData customData = isCustomDataTypisiert
        ? new GebieteAuswaehlenTypisiertErgebnisKonfliktCustomData(losentscheidTyp)
        : new GebieteAuswaehlenErgebnisKonfliktCustomData();
    return helper.createGebieteAuswahlKonflikt(customData, losentscheidTyp, anzahlZuLosen, gebiete);
  }

}
