package eu.dnetlib.contract.cp.eval;

import java.util.HashSet;
import java.util.Set;

import eu.dnetlib.contract.cp.ICheckPoint;
import eu.dnetlib.contract.event.IContractEvent;
import eu.dnetlib.contract.node.EvaluationResult;


/**
 * Evaluation context tree node.
 * @author mhorst
 *
 */
public class EvaluationContextTreeNode {

	/**
	 * Current check point.
	 */
	private ICheckPoint<IContractEvent> checkPoint;
	
	/**
	 * Current check point evaluation result.
	 */
	private EvaluationResult result;
	
	/**
	 * Evaluation context parent tree node.
	 */
	private EvaluationContextTreeNode parentNode;
	
	/**
	 * Evaluation context children set.
	 */
	private Set<EvaluationContextTreeNode> childrenNodes;

	
	/**
	 * Default constructor.
	 * @param checkPoint
	 * @param parentNode
	 */
	public EvaluationContextTreeNode(ICheckPoint<IContractEvent> checkPoint,
			EvaluationContextTreeNode parentNode) {
		this.checkPoint = checkPoint;
		this.parentNode = parentNode;
		this.childrenNodes = new HashSet<EvaluationContextTreeNode>();
	}
	
	/**
	 * Returns check point.
	 * @return check point
	 */
	public ICheckPoint<IContractEvent> getCheckPoint() {
		return checkPoint;
	}

	/**
	 * Sets check point.
	 * @param checkPoint
	 */
	public void setCheckPoint(ICheckPoint<IContractEvent> checkPoint) {
		this.checkPoint = checkPoint;
	}

	/**
	 * Sets result entry for current context.
	 * @param result
	 */
	public void setResult(EvaluationResult result) {
		this.result = result;
	}
	
	/**
	 * Returns {@link EvaluationResult} for context.
	 * @param parent
	 * @return evaluation result for context
	 */
	public EvaluationResult getResult() {
		return result;
	}

	/**
	 * Returns parent tree node.
	 * @return parent tree node
	 */
	public EvaluationContextTreeNode getParentNode() {
		return parentNode;
	}

	/**
	 * Sets parent tree node.
	 * @param parentTreeNode
	 */
	public void setParentNode(EvaluationContextTreeNode parentNode) {
		this.parentNode = parentNode;
	}

	/**
	 * Returns children nodes.
	 * @return children nodes
	 */
	public Set<EvaluationContextTreeNode> getChildrenNodes() {
		return childrenNodes;
	}

	/**
	 * Registers single child tree node.
	 * @param node
	 */
	public void registerChildNode(EvaluationContextTreeNode node) {
		this.childrenNodes.add(node);
	}

}
