
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.PolitischeGruppenAuswaehlenErgebnisKonfliktCustomData;
import de.ivu.elect.business.ergebniskonflikt.entity.PolitischeGruppenAuswaehlenTypisiertErgebnisKonfliktCustomData;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.sitzberechnung.control.util.SitzberechnungProGebietHelper;
import de.ivu.elect.business.sitzberechnung.control.verteilung.PolitischeGruppeTeilnehmer;

public class PolitischeGruppenAuswaehlenErgebnisKonfliktBehandler
    extends
      AbstractVerteilungsErgebnisKonfliktBehandler<PolitischeGruppe, PolitischeGruppeTeilnehmer> {

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

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

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

  @Override
  protected List<PolitischeGruppe> getGelosteTeilnehmerAusKonfliktBehandlung(
      List<PolitischeGruppe> teilnehmerAmLosverfahren, ErgebnisKonflikt geloesterKonflikt) {
    PolitischeGruppenAuswaehlenErgebnisKonfliktCustomData customData = geloesterKonflikt
        .getCustomData(PolitischeGruppenAuswaehlenErgebnisKonfliktCustomData.class);
    return customData.getGelostePolitischeGruppen(teilnehmerAmLosverfahren);
  }

  @Override
  protected ErgebnisKonflikt erzeugeKonflikt(List<PolitischeGruppe> politischeGruppen, long anzahlZuLosen) {
    PolitischeGruppenAuswaehlenErgebnisKonfliktCustomData customData = isCustomDataTypisiert
        ? new PolitischeGruppenAuswaehlenTypisiertErgebnisKonfliktCustomData(losentscheidTyp)
        : new PolitischeGruppenAuswaehlenErgebnisKonfliktCustomData();
    return helper.createPolitischeGruppenAuswahlKonflikt(customData, anzahlZuLosen, politischeGruppen, losentscheidTyp);
  }

}
