
package de.ivu.elect.presentation.wahlbeteiligung;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungPK;
import de.ivu.elect.presentation.stimmeingabe.CollapsedProperty;
import de.ivu.elect.presentation.wahlbeteiligung.status.WahlbeteiligungErfassungsstatus;

@ViewAccessScoped
public class WahlbeteiligungAuswertungStatusViewState implements Serializable {

  private static final long serialVersionUID = 1L;

  private WahlbeteiligungAuswertung ausgewaehlteWahlbeteiligung;
  private Map<WahlbeteiligungAuswertungPK, Map<WahlbeteiligungErfassungsstatus, CollapsedProperty>> collapsedStateMap = new HashMap<>();

  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    reset();
  }

  public CollapsedProperty getCollapsedProperty(WahlbeteiligungAuswertungPK wahlbeteiligungAuswertungPk,
      WahlbeteiligungErfassungsstatus status, boolean defaultState) {
    if (!collapsedStateMap.containsKey(wahlbeteiligungAuswertungPk)) {
      collapsedStateMap.put(wahlbeteiligungAuswertungPk, new HashMap<>());
    }

    if (!collapsedStateMap.get(wahlbeteiligungAuswertungPk).containsKey(status)) {
      collapsedStateMap.get(wahlbeteiligungAuswertungPk).put(status, new CollapsedProperty(defaultState));
    }

    return collapsedStateMap.get(wahlbeteiligungAuswertungPk).get(status);
  }

  public void reset() {
    collapsedStateMap = new HashMap<>();
  }

  public WahlbeteiligungAuswertung getAusgewaehlteWahlbeteiligung() {
    return ausgewaehlteWahlbeteiligung;
  }

  public void setAusgewaehlteWahlbeteiligung(WahlbeteiligungAuswertung ausgewaehlteWahlbeteiligung) {
    this.ausgewaehlteWahlbeteiligung = ausgewaehlteWahlbeteiligung;
  }
}
