/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.oodt.cas.workflow.gui.perspective.view;

//OODT imports
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.workflow.gui.model.ModelGraph;
import org.apache.oodt.cas.workflow.gui.model.repo.XmlWorkflowModelRepository.ConfigGroup;
import org.apache.oodt.cas.workflow.gui.perspective.view.View.Mode;
import org.apache.oodt.cas.workflow.gui.util.GuiUtils;

//JDK imports
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.UUID;
import java.util.Vector;

/**
 * 
 * The current state of a particular Workflow GUI editor view.
 * 
 * @author bfoster
 * @author mattmann
 * 
 */
public class ViewState {

  private static final HashMap<String, Stack<ViewState>> undoHistory = new HashMap<String, Stack<ViewState>>();

  private ModelGraph selected;
  private List<ModelGraph> graphs;
  private String id;
  private String currentMetGroup;
  private Metadata properties;
  private Mode mode;
  private File file;
  private boolean change = false;
  private Map<String, ConfigGroup> globalConfigGroups;

  public ViewState(File file, ModelGraph selected, List<ModelGraph> graphs,
      Map<String, ConfigGroup> globalConfigGroups) {
    this.selected = selected;
    this.graphs = new Vector<ModelGraph>(graphs);
    this.id = UUID.randomUUID().toString();
    this.currentMetGroup = null;
    this.properties = new Metadata();
    this.mode = Mode.EDIT;
    this.file = file;
    this.globalConfigGroups = globalConfigGroups;
  }

  public Map<String, ConfigGroup> getGlobalConfigGroups() {
    return this.globalConfigGroups;
  }

  public void addGlobalConfigGroup(String groupName, ConfigGroup configGroup) {
    this.globalConfigGroups.put(groupName, configGroup);
  }

  public void removeGlobalConfigGroup(String groupName) {
    this.globalConfigGroups.remove(groupName);
  }

  public File getFile() {
    return this.file;
  }

  public String getId() {
    return this.id;
  }

  public boolean containsProperty(String key) {
    return this.properties.containsGroup(key);
  }

  public void setProperty(String key, String value) {
    Vector<String> values = new Vector<String>();
    values.add(value);
    this.setProperty(key, values);
  }

  public void setProperty(String key, List<String> values) {
    this.properties.replaceMetadata(key, values);
    this.change = true;
  }

  public String getFirstPropertyValue(String key) {
    List<String> values = this.getProperty(key);
    if (values == null || values.size() == 0)
      return null;
    return values.get(0);
  }

  public List<String> getProperty(String key) {
    return this.properties.getAllMetadata(key);
  }

  public void removeProperty(String key) {
    this.properties.removeMetadata(key);
    this.change = true;
  }

  public List<String> getKeysRecur(String subGroup) {
    Vector<String> keys = new Vector<String>();
    for (String key : this.properties.getAllKeys())
      if (key.contains(subGroup))
        keys.add(key);
    return keys;
  }

  public void setSelected(ModelGraph selected) {
    if (this.selected == null || selected == null
        || !this.selected.equals(selected)) {
      this.currentMetGroup = null;
      this.selected = selected;
      this.change = true;
    }
  }

  public ModelGraph getSelected() {
    if (this.mode.equals(Mode.EDIT))
      return this.selected;
    else
      return null;
  }

  public Set<String> getGraphIds() {
    HashSet<String> graphIds = new HashSet<String>();
    for (ModelGraph graph : this.getGraphs())
      graphIds.add(graph.getModel().getModelId());
    return graphIds;
  }

  public List<ModelGraph> getGraphs() {
    return this.graphs;
  }

  public void removeGraph(ModelGraph graph) {
    this.graphs.remove(graph);
  }

  public void addGraph(ModelGraph graph) {
    this.graphs.add(graph);
  }

  public void setMode(Mode mode) {
    this.mode = mode;
    this.change = true;
  }

  public Mode getMode() {
    return this.mode;
  }

  public void setCurrentMetGroup(String currentMetGroup) {
    this.currentMetGroup = currentMetGroup;
    this.change = true;
  }

  public String getCurrentMetGroup() {
    return this.currentMetGroup;
  }

  public boolean hasChanged() {
    return this.change;
  }

  public void save() {
    if (this.change) {
      Stack<ViewState> stack = undoHistory.get(this.id);
      if (stack == null)
        stack = new Stack<ViewState>();
      if (stack.size() >= 100)
        stack.remove(stack.size() - 1);
      stack.push(this.clone());
      undoHistory.put(this.id, stack);
      this.change = false;
    }
  }

  public void undo() {
    Stack<ViewState> stack = undoHistory.get(this.id);
    if (stack != null && !stack.empty()) {
      this.clone(stack.pop());
      System.out.println(this.getGraphIds());
      this.change = false;
    }
  }

  public void clone(ViewState state) {
    this.graphs = null;
    this.selected = null;
    if (state.graphs != null) {
      this.graphs = new Vector<ModelGraph>();
      for (ModelGraph graph : state.graphs)
        this.graphs.add(graph.clone());
      if (state.selected != null)
        this.selected = GuiUtils.find(this.graphs, state.selected.getModel()
            .getModelId());
    }
    this.properties = new Metadata(state.properties);
    this.id = state.id;
    this.currentMetGroup = state.currentMetGroup;
    this.mode = state.mode;
  }

  public ViewState clone() {
    List<ModelGraph> cloneGraphs = null;
    ModelGraph selected = null;
    if (this.graphs != null) {
      cloneGraphs = new Vector<ModelGraph>();
      for (ModelGraph graph : this.graphs)
        cloneGraphs.add(graph.clone());
      if (this.selected != null)
        selected = GuiUtils.find(cloneGraphs, this.selected.getModel()
            .getModelId());
    }
    ViewState clone = new ViewState(this.file, selected, cloneGraphs,
        this.globalConfigGroups);
    clone.id = this.id;
    clone.file = this.file;
    clone.currentMetGroup = this.currentMetGroup;
    clone.properties = new Metadata(this.properties);
    clone.mode = this.mode;
    return clone;
  }

  public int hashCode() {
    return this.id.hashCode();
  }

  public boolean equals(Object obj) {
    return obj instanceof ViewState && this.id.equals(((ViewState) obj).id);
  }

  public String toString() {
    return this.getId();
  }

}
