package de.ivu.elect.business.stimmeingabe.boundary;

import java.util.HashMap;
import java.util.Map;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.auffaelligkeit.entity.ArtBetrachteterStimmen;
import de.ivu.elect.business.auffaelligkeit.entity.AuffaelligkeitsbemerkungenErzeugerToleranz;
import de.ivu.elect.business.auffaelligkeit.entity.GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.hochrechnung.boundary.HochrechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.hochrechnung.entity.HochrechnungsalgorithmusArt;
import de.ivu.elect.business.search.control.AbstractElectSearchParameters;

/**
 *  on 29.03.2016.
 */
@GroupedConversationScoped
@ConversationGroup(StimmeingabeAuffaelligkeitSearchParameters.class)
public class StimmeingabeAuffaelligkeitSearchParameters extends AbstractElectSearchParameters {

  private static final long DEFAUL_K_VALUE = 10;

  private static final Long DEFAUL_ANZAHL_GRUPPEN_BEI_GEBIETS_VERGLEICH = 5L;

  private HochrechnungsalgorithmusKonfiguration hochrechnungsalgorithmusKonfiguration = null;

  public StimmeingabeAuffaelligkeitSearchParameters() {
    super();
  }

  public StimmeingabeAuffaelligkeitSearchParameters(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, Ergebnis ergebnis) {
    this.wahldurchfuehrungsgebiet = wahldurchfuehrungsgebiet;
    this.ergebnis = ergebnis;
  }

  private Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet;

  private Ergebnis ergebnis;

  public Ergebnis getErgebnis() {
    return ergebnis;
  }

  public void setErgebnis(Ergebnis ergebnis) {
    this.ergebnis = ergebnis;
  }

  public Wahldurchfuehrungsgebiet getWahldurchfuehrungsgebiet() {
    return wahldurchfuehrungsgebiet;
  }

  public void setWahldurchfuehrungsgebiet(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    this.wahldurchfuehrungsgebiet = wahldurchfuehrungsgebiet;
  }

  // ==============================================================================

  private HochrechnungsalgorithmusArt hochrechnungsalgorithmusArt = HochrechnungsalgorithmusArt.HOCHRECHNEN_MIT_DISTANCE_WEIGHTED_KNEAREST_NEIGHBORS;

  public HochrechnungsalgorithmusArt getHochrechnungsalgorithmusArt() {
    return hochrechnungsalgorithmusArt;
  }

  public void setHochrechnungsalgorithmusArt(HochrechnungsalgorithmusArt hochrechnungsalgorithmusArt) {
    this.hochrechnungsalgorithmusArt = hochrechnungsalgorithmusArt;
  }

  private final Map<HochrechnungsalgorithmusArt, HochrechnungsalgorithmusKonfiguration> konfigurationNachHochrechnungsalgorithmusArt = new HashMap<>();

  public Map<HochrechnungsalgorithmusArt, HochrechnungsalgorithmusKonfiguration> getKonfigurationNachHochrechnungsalgorithmusArt() {
    return konfigurationNachHochrechnungsalgorithmusArt;
  }

  public HochrechnungsalgorithmusKonfiguration getHochrechnungsalgorithmusKonfiguration() {
    HochrechnungsalgorithmusArt hochrechnungsalgorithmusArt = getHochrechnungsalgorithmusArt();
    if (hochrechnungsalgorithmusArt == null) {
      return null;
    }
    HochrechnungsalgorithmusKonfiguration konfiguration = konfigurationNachHochrechnungsalgorithmusArt.get(hochrechnungsalgorithmusArt);
    if (konfiguration == null) {
      konfiguration = hochrechnungsalgorithmusArt.getKonfiguration();
      konfigurationNachHochrechnungsalgorithmusArt.put(hochrechnungsalgorithmusArt, konfiguration);
    }
    return konfiguration;
  }

  // ==============================================================================

  private GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche = GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche.NUR_URNENWAHLGEBIET;

  public GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche getGebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche() {
    return gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche;
  }

  public void setGebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche(GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche) {
    this.gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche = gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche;
  }

  // ==============================================================================

  private AuffaelligkeitsbemerkungenErzeugerToleranz auffaelligkeitsbemerkungenErzeugerToleranz = AuffaelligkeitsbemerkungenErzeugerToleranz.NORMAL;

  public AuffaelligkeitsbemerkungenErzeugerToleranz getAuffaelligkeitsbemerkungenErzeugerToleranz() {
    return auffaelligkeitsbemerkungenErzeugerToleranz;
  }

  public void setAuffaelligkeitsbemerkungenErzeugerToleranz(AuffaelligkeitsbemerkungenErzeugerToleranz auffaelligkeitsbemerkungenErzeugerToleranz) {
    this.auffaelligkeitsbemerkungenErzeugerToleranz = auffaelligkeitsbemerkungenErzeugerToleranz;
  }

  // ==============================================================================

  private ArtBetrachteterStimmen artBetrachteterStimmen = ArtBetrachteterStimmen.ANTEILE;

  public ArtBetrachteterStimmen getArtBetrachteterStimmen() {
    return artBetrachteterStimmen;
  }

  public void setArtBetrachteterStimmen(ArtBetrachteterStimmen artBetrachteterStimmen) {
    this.artBetrachteterStimmen = artBetrachteterStimmen;
  }

  // ==============================================================================

  private Long anzahlVonGebietVergleichen = DEFAUL_K_VALUE;

  public Long getAnzahlVonGebietVergleichen() {
    return anzahlVonGebietVergleichen;
  }

  public void setAnzahlVonGebietVergleichen(Long anzahlVonGebietVergleichen) {
    this.anzahlVonGebietVergleichen = anzahlVonGebietVergleichen;
  }

  private Long anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich = 5L;

  public Long getAnzahlVonAnzuzeigendenGruppenBeiGebietsvergleich() {
    return anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich;
  }

  public void setAnzahlVonAnzuzeigendenGruppenBeiGebietsvergleich(Long anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich) {
    this.anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich = anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich;
  }

  @Override
  public void reset() {
    super.reset();
    hochrechnungsalgorithmusArt = HochrechnungsalgorithmusArt.HOCHRECHNEN_MIT_DISTANCE_WEIGHTED_KNEAREST_NEIGHBORS;
    gebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche = GebietsartenDerBetrachtetenGebieteInAuffaelligkeitssuche.NUR_URNENWAHLGEBIET;
    auffaelligkeitsbemerkungenErzeugerToleranz = AuffaelligkeitsbemerkungenErzeugerToleranz.NORMAL;
    artBetrachteterStimmen = ArtBetrachteterStimmen.ANTEILE;
    anzahlVonGebietVergleichen = DEFAUL_K_VALUE;
    anzahlVonAnzuzeigendenGruppenBeiGebietsvergleich = DEFAUL_ANZAHL_GRUPPEN_BEI_GEBIETS_VERGLEICH;
  }
}


