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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahllokalsystem.entity.WahllokalsystemStatus;
import de.ivu.elect.business.wahllokalsystem.entity.WahllokalsystemStatusDokumentEventType;
import de.ivu.elect.business.wahllokalsystem.entity.WahllokalsystemStatusOnline;
import de.ivu.elect.business.wahllokalsystem.entity.WahllokalsystemStimmbezirksart;
import de.ivu.elect.jee.presentation.dynamicform.BooleanFilterKriterium;
import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import java.util.*;

@GroupedConversationScoped
@ConversationGroup(AbstractWahllokalsystemStatusSearchParameters.class)
public class WahllokalsystemStatusSearchParameters extends AbstractWahllokalsystemStatusSearchParameters {

  private static final long serialVersionUID = 1L;
  private static final List<WahllokalsystemStatusOnline> INITIALE_ONLINE_STATUS = Arrays.asList(WahllokalsystemStatusOnline.values());

  private WahllokalsystemStatus wahllokalsystemStatus;

  private List<Wahl> weitereWahlen = new ArrayList<>();

  private WahllokalsystemStimmbezirksart wahllokalsystemStimmbezirksart = WahllokalsystemStimmbezirksart.ALLE;

  public List<Wahl> getWeitereWahlen() {
    return weitereWahlen;
  }

  private Wahl wahlFurDokumentVorhandenSuche = null;

  private Map<WahllokalsystemStatusDokumentEventType, BooleanFilterKriterium> dokumentVorhandenKriterium = new HashMap<>();

  public Map<WahllokalsystemStatusDokumentEventType, BooleanFilterKriterium> getDokumentVorhandenKriterium() {
    return dokumentVorhandenKriterium;
  }




  public Wahl getWahlFurDokumentVorhandenSuche() {
    return wahlFurDokumentVorhandenSuche;
  }

  public void setWahlFurDokumentVorhandenSuche(Wahl wahlFurDokumentVorhandenSuche) {
    this.wahlFurDokumentVorhandenSuche = wahlFurDokumentVorhandenSuche;
  }

  public void setWeitereWahlen(List<Wahl> weitereWahlen) {
    this.weitereWahlen = weitereWahlen;
  }

  private Collection<WahllokalsystemStatusOnline> statusOnline = new ArrayList<>(INITIALE_ONLINE_STATUS);

  public WahllokalsystemStatus getWahllokalsystemStatus() {
    if (wahllokalsystemStatus == null) {
      wahllokalsystemStatus = new WahllokalsystemStatus();
      wahllokalsystemStatus.setAusstattung(null);
    }
    return wahllokalsystemStatus;
  }

  public WahllokalsystemStimmbezirksart getWahllokalsystemStimmbezirksart() {
    return wahllokalsystemStimmbezirksart;
  }

  public void setWahllokalsystemStimmbezirksart(WahllokalsystemStimmbezirksart wahllokalsystemStimmbezirksart) {
    this.wahllokalsystemStimmbezirksart = wahllokalsystemStimmbezirksart;
  }


  public Collection<WahllokalsystemStatusOnline> getStatusOnline() {
    return statusOnline;
  }

  public void setStatusOnline(Collection<WahllokalsystemStatusOnline> statusOnline) {
    this.statusOnline = statusOnline;
  }

  public Wahl getWahl() {
    return getWahllokalsystemStatus().getWahl();
  }

  public void setWahl(Wahl wahl) {
    getWahllokalsystemStatus().setWahl(wahl);
    if (wahlFurDokumentVorhandenSuche == null) {
      wahlFurDokumentVorhandenSuche = wahl;
    }
  }

  public Gebiet getGebiet() {
    return getWahllokalsystemStatus().getGebiet();
  }

  public void setGebiet(Gebiet gebiet) {
    getWahllokalsystemStatus().setGebiet(gebiet);
  }

  @Override
  public void reset() {
    super.reset();
    wahllokalsystemStatus = null;
    weitereWahlen = new ArrayList<>();
    statusOnline = new ArrayList<>(INITIALE_ONLINE_STATUS);
    wahllokalsystemStimmbezirksart = WahllokalsystemStimmbezirksart.ALLE;
    dokumentVorhandenKriterium = new HashMap<>();
    wahlFurDokumentVorhandenSuche = null;
  }
}
