package org.arefgard.flow.node;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.arefgard.flow.core.UsecaseExpression;

/**
 * 条件分岐を表すノード。
 * 
 * @author Takashi Yamashi
 * @since 1.0.0
 */
public class DecisionNode extends Node {
	
	/** 条件分岐マップ */
	private Map<String, String> navigations = new java.util.HashMap<String, String>();
	
	public void addProperty(String condition, String nextTo) {
		this.navigations.put(condition, nextTo);
	}

	/**
	 * ユースケースフローの状態から遷移先を決定する。
	 * 
	 * @param params ユースケースフローの状態
	 * @return 遷移先
	 */
	public String decide(Map<String, Object> params) {
		Set<String> keys = this.navigations.keySet();
		
		for(Iterator<String> itr = keys.iterator(); itr.hasNext();) {
			String navi = itr.next();
			String nextTo = this.navigations.get(navi);
			UsecaseExpression expression = new UsecaseExpression(navi);
			expression.setArgs(params);
			if(expression.evaluateBoolean()) {
				return nextTo;
			}

		}
		return null;
	}
}
