package de.ivu.elect.presentation.gebietsbaum.tree;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.event.NodeExpandEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminPK;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.presentation.view.AbstractView;


@RequestScoped
@Named(AbstractNoStoreGebietsbaumView.COMPONENT_NAME)
public class LazyGebietsbaumView extends AbstractNoStoreGebietsbaumView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietsbaumTreeBuilderLazy gebietsbaumTreeBuilder;

  @Inject
  private transient LazyGebietsbaumStore lazyGebietsbaumStore;

  @Inject
  private transient WahlterminSessionSelect wahlterminSessionSelect;

  @Inject
  private transient WahlSessionSelector wahlSessionSelector;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @PostConstruct
  public void init() {
    if (lazyGebietsbaumStore.requestViewWahlOrWahlterminChanged(FacesContextUtil.getCurrentViewId(), getWahlterminPk(), getWahlPk()) || /*REIHENFOLGE LASSEN(!)*/ isResetViewStack() || lazyGebietsbaumStore.getRoot()==null /*ELECT-8130*/ || !gebietSessionSelect.isSelected()/*ELECT-8130*/) {
      reset();
    }
  }

  private WahlPK getWahlPk() {
    if (wahlSessionSelector.isSelected()) {
      Wahl wahl = wahlSessionSelector.getEntity();
      if (wahl!=null) {
        return wahl.getPk();
      }
    }
    return null;
  }

  private WahlterminPK getWahlterminPk() {
    if (wahlterminSessionSelect.isSelected()) {
      Wahltermin wahltermin = wahlterminSessionSelect.getEntity();
      if (wahltermin != null) {
        return wahltermin.getPk();
      }
    }
    return null;
  }

  private boolean isResetViewStack() {
    return AbstractView.RESET_VIEW_STACK_REQUEST_VALUE.equalsIgnoreCase(FacesContextUtil.getRequest().getParameter(
        AbstractView.RESET_VIEW_STACK_REQUEST_PARAMETER_NAME));

  }

  @Override
  protected AbstractGebietsbaumTreeBuilder getGebietsbaumTreeBuilder() {
    return gebietsbaumTreeBuilder;
  }

  @Override
  protected DefaultTreeNode getRootInternal() {
    return lazyGebietsbaumStore.getRoot();
  }

  @Override
  protected void setRootInternal(DefaultTreeNode root) {
    lazyGebietsbaumStore.setRoot(root);
  }

  @Override
  protected void setSelectedNodeInternal(TreeNode selectedNode) {
    TreeNode selectedNodeBisher = lazyGebietsbaumStore.getSelectedNode();
    if (selectedNodeBisher != null) {
      selectedNodeBisher.setSelected(false);
    }
    lazyGebietsbaumStore.setSelectedNode(selectedNode);
  }

  @Override
  protected TreeNode getSelectedNodeInternal() {
    return lazyGebietsbaumStore.getSelectedNode();
  }

  @Override
  public void onNodeExpand(NodeExpandEvent event) {
    super.onNodeExpand(event);

    initRootAndSelectedNode();

    GebietsbaumTreeNode gebietsbaumTreeNode = (GebietsbaumTreeNode) event.getTreeNode();

    if (!gebietsbaumTreeNode.isChildrenLoaded() && gebietsbaumTreeNode.getChildCount() == 0) {
      gebietsbaumTreeBuilder.lazyLoad(gebietsbaumTreeNode);
    }
  }

  @Override
  protected void setTreeReadyInternal(boolean treeReady) {
    lazyGebietsbaumStore.setTreeReady(treeReady);
  }

  @Override
  protected boolean isTreeReadyInternal() {
    return lazyGebietsbaumStore.isTreeReady();
  }

}
