package de.ivu.elect.business.lokalisierung.control;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

import de.ivu.elect.jee.faces.FacesContextUtil;

public class LokalisierungSchluesselCollectorPhaseListener implements PhaseListener {

  @Override
  public void afterPhase(PhaseEvent phaseEvent) {
    if (LokalisierungStore.isSchluesselPerRequestSammelnAktiv() && !javax.faces.context.FacesContext.getCurrentInstance().isPostback() && !FacesContextUtil.isPartialRequest()) {
      FacesContext context = phaseEvent.getFacesContext();

      if (context.getViewRoot() != null) {
        LokalisierungSchluesselCollector collector = LokalisierungStore.getLokalisierungSchluesselCollector();
        if (collector != null) {
          collector.setViewId(context.getViewRoot().getViewId());
        }
      }
    }
  }

  @Override
  public void beforePhase(PhaseEvent phaseEvent) {
    if (LokalisierungStore.isSchluesselPerRequestSammelnAktiv()) {
      LokalisierungSchluesselCollector collector;
      // Nur bei GET-Requests neue Instanz von LokalisierungSchluesselCollector anlegen (keine Posts, keine Partial-Ajax-Requests)
      if (!javax.faces.context.FacesContext.getCurrentInstance().isPostback() && !FacesContextUtil.isAjaxRequest() && !FacesContextUtil.isPartialRequest()) {
        collector = new LokalisierungSchluesselCollector();
        LokalisierungSchluesselCollectorLastRequestStore lokalisierungSchluesselCollectorLastRequestStore = getContextualInstance(phaseEvent);
        lokalisierungSchluesselCollectorLastRequestStore.setLokalisierungSchluesselCollector(collector);
      } else {
        collector = getContextualInstance(phaseEvent).getLokalisierungSchluesselCollector();
      }
      LokalisierungStore.setLokalisierungSchluesselCollector(collector);
    }

  }

  protected LokalisierungSchluesselCollectorLastRequestStore getContextualInstance(PhaseEvent phaseEvent) {
    FacesContext context = phaseEvent.getFacesContext();
    return context.getApplication().evaluateExpressionGet(context, "#{" + LokalisierungSchluesselCollectorLastRequestStore.COMPONENT_NAME + "}", LokalisierungSchluesselCollectorLastRequestStore.class);
  }

  @Override
  public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
  }
}



