package com.google.ar.core.examples.java.common.framework.scenario;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

public class ScenarioState extends State {
	private Hashtable<Event, Event> transitionSyncs = new Hashtable<Event, Event>();
	private Hashtable<Event, ArrayList<State>> transitionGuards = new Hashtable<Event, ArrayList<State>>();
	private Hashtable<Event, ScenarioAction> transitionActions = new Hashtable<Event, ScenarioAction>();
	private String message = null;
	
	public ScenarioState() {
		super();
	}

	public ScenarioState(Hashtable<Event, State> transitions,
                         Hashtable<Event, Event> transitionSyncs,
                         Hashtable<Event, ArrayList<State>> transitionGuards,
                         Hashtable<Event, ScenarioAction> transitionActions,
                         String message) {
		super(transitions);
		this.transitionSyncs = transitionSyncs;
		this.transitionGuards = transitionGuards;
		this.transitionActions = transitionActions;
		this.message = message;
	}
	
	public void addTransition(Event event, State succ, Event syncEvent, ArrayList<State> guards, ScenarioAction action) {
		addTransition(event, succ);
		if (syncEvent != null) transitionSyncs.put(event, syncEvent);
		if (guards != null) transitionGuards.put(event, guards);
		if (action != null) transitionActions.put(event, action);
	}
	
	Event canTrans(Event event) {
		Enumeration<Event> events = getEvents();
		while (events.hasMoreElements()) {
			Event e = events.nextElement();
			if (event == e || event == transitionSyncs.get(e)) {
				ArrayList<State> guardStates = transitionGuards.get(e);
				boolean bSatisfyGuard = true;
				for (int n = 0; n < guardStates.size(); n++) {
					State s = guardStates.get(n);
					if (s.getOwner().getCurrentState() != s) {
						bSatisfyGuard = false;
						break;
					}
				}
				if (bSatisfyGuard) return e;
			}
		}
		return null;
	}

	public ScenarioAction getAction(Event e) {
		return transitionActions.get(e);
	}
	
	public void setMessage(String message) {
		this.message = message;
	}

	public String getMessage() {
		return message;
	}
}
