/*******************************************************************************
 * Copyright (c) 2004-2010 Abel Hegedus and Daniel Varro
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Abel Hegedus - initial API and implementation
 *******************************************************************************/
package org.eclipse.viatra2.core.tracebased.tracetree;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author Abel Hegedus
 *
 */
public abstract class AbstractTraceTreeNode implements ITraceTreeNode {

	private Map<String,ITraceTreeNode> children;
	private List<ITraceTreeNode> orderedChildren;
	private ITraceTreeNode parent;
	private String id;
	private boolean terminated = false;
	
	/* (non-Javadoc)
	 * @see org.eclipse.viatra2.trace.trace.ITraceTreeNode#getChildren()
	 */
	@Override
	public Map<String,ITraceTreeNode> getChildren() {
		if(children == null){
			children = new TreeMap<String, ITraceTreeNode>();
			orderedChildren = new ArrayList<ITraceTreeNode>();
		}
		return children;
	}

	@Override
	public List<ITraceTreeNode> getOrderedChildrenList() {
		if(orderedChildren == null){
			children = new TreeMap<String, ITraceTreeNode>();
			orderedChildren = new ArrayList<ITraceTreeNode>();
		}
		return orderedChildren;
	}
	
	@Override
	public void addChild(ITraceTreeNode child) {
		getChildren().put(child.getID(), child);
		getOrderedChildrenList().add(child);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.viatra2.trace.trace.ITraceTreeNode#getChildrenIDs()
	 */
	@Override
	public Set<String> getChildrenIDs() {
		
		return getChildren().keySet();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.viatra2.trace.trace.ITraceTreeNode#getChild(java.lang.String)
	 */
	@Override
	public ITraceTreeNode getChild(String childID) {
		// TODO Auto-generated method stub
		return getChildren().get(childID);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.viatra2.trace.trace.ITraceTreeNode#getID()
	 */
	@Override
	public String getID() {
		return id;
	}

	/**
	 * 
	 */
	public AbstractTraceTreeNode(ITraceTreeNode parent, String id) {
		this.parent = parent; 
		this.id = id;
		if(parent != null){
			parent.addChild(this);
		}
		
	}
	

	/* (non-Javadoc)
	 * @see org.eclipse.viatra2.trace.trace.ITraceTreeNode#getParent()
	 */
	@Override
	public ITraceTreeNode getParent() {
		return parent;
	}

	/**
	 * @param terminated the terminated to set
	 */
	public void setTerminated(boolean terminated) {
		this.terminated = terminated;
	}

	/**
	 * @return the terminated
	 */
	public boolean isTerminated() {
		return terminated;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		
		StringBuilder sb = new StringBuilder();
		sb.append("ID: ").append(id);
		if(parent != null){
			sb.append("; Parent: ").append(parent.getID());
		}
		if(terminated){
			sb.append("; Terminated");
		} else {
			sb.append("; In progress");
		}
		return sb.toString();
	}

	/**
	 * @return the orderedChildren
	 */
	public List<ITraceTreeNode> getOrderedChildren() {
		return orderedChildren;
	}

}
