
package de.ivu.elect.presentation.stimmeingabe;

import java.util.Collection;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.system.entity.BeanScope;

@RequestScoped
public class StimmeingabeErfassenViewRequestScopedStateStore implements StimmeingabeErfassenViewRequestScopedState {

  private static final Logger LOG = LoggerFactory.getLogger(StimmeingabeErfassenViewRequestScopedStateStore.class);

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  protected transient KonfigurationExtendedLoader konfigurationExtendedLoader;

  @Inject
  private transient StimmeingabeErfassenViewViewAccessScopedStateStore stimmeingabeErfassenViewViewAccessScopedStateStore;

  private BeanScope contextScope;

  /*
   * NOTE ELECT-2923, dass die GruppenImGebiet bei jedem Request neu attached werden müssen. (Viele
   * StimmeingabeErfassenViews sind jedoch @ViewAccessScoped.)
   *
   * Der Grund ist, dass in GruppeImGebiet Hibernate-gestützte Collections verwendet werden, jedoch beim zweiten Request
   * die Hibernate-Session hierfür weg ist.
   */
  private Collection<GruppeImGebiet> gruppenImGebiet;

  // ELECT-12324
  private StimmeingabeErfassenViewContext stimmeingabeErfassenViewContext;
  private List<StimmeingabePlausiFehler> stimmeingabenPlausiFehler;


  public StimmeingabeErfassenViewRequestScopedStateStore() {
    super();
  }

  @Override
  public Collection<GruppeImGebiet> getGruppenImGebiet() {
    return gruppenImGebiet;
  }

  public void setGruppenImGebiet(Collection<GruppeImGebiet> gruppenImGebiet) {
    this.gruppenImGebiet = gruppenImGebiet;
  }

  public void reset() {
    gruppenImGebiet = null;
    stimmeingabeErfassenViewContext=null;
    stimmeingabenPlausiFehler=null;
    stimmeingabeErfassenViewViewAccessScopedStateStore.reset();
  }

  public StimmeingabeErfassenViewContext getStimmeingabeErfassenViewContext() {
    if (stimmeingabeErfassenViewContext==null) {
      return stimmeingabeErfassenViewViewAccessScopedStateStore.getStimmeingabeErfassenViewContext();
    }
    return stimmeingabeErfassenViewContext;
  }

  public void setStimmeingabeErfassenViewContext(StimmeingabeErfassenViewContext stimmeingabeErfassenViewContext) {
    this.stimmeingabeErfassenViewContext = stimmeingabeErfassenViewContext;
    if (getContextScope().isViewAccesScope()) {
      stimmeingabeErfassenViewViewAccessScopedStateStore.setStimmeingabeErfassenViewContext(stimmeingabeErfassenViewContext);
    }
  }

  public List<StimmeingabePlausiFehler> getStimmeingabenPlausiFehler() {
    if (stimmeingabenPlausiFehler == null) {
      return stimmeingabeErfassenViewViewAccessScopedStateStore.getStimmeingabenPlausiFehler();
    }
    return stimmeingabenPlausiFehler;
  }

  public void setStimmeingabenPlausiFehler(List<StimmeingabePlausiFehler> stimmeingabenPlausiFehler) {
    this.stimmeingabenPlausiFehler = stimmeingabenPlausiFehler;
    if (getContextScope().isViewAccesScope()) {
      stimmeingabeErfassenViewViewAccessScopedStateStore.setStimmeingabenPlausiFehler(stimmeingabenPlausiFehler);
    }
  }

  protected BeanScope getContextScope() {
    if (contextScope == null) {
      if (principal.getMandant() != null) {
        contextScope = konfigurationExtendedLoader
            .resolveEnumValue(principal.getMandant(), MandantKonfigurationWerte.STIMMEINGABE_ABLAGE_CONTEXT, BeanScope.class);
      }
      if (contextScope == null) {
        LOG.warn("ContextScope: fallback");
        contextScope = BeanScope.REQUEST; // fallback
      }
    }
    return contextScope;
  }

}
