// Generated from:
//
//
<%
var i, j,
        outerIf = 'if',
        innerIf = 'if',
        initialStateName;

for (i = 0; i < stateMachine.states.length; i += 1) {
    if (stateMachine.states[i].id === stateMachine.initialState) {
        initialStateName = stateMachine.states[i].name;
        break;
    }
}

%>
#include <iostream>
#include <string>
#include <set>


int main(int argc, char** argv)
{
    std::cout << "State machine for <%=stateMachine.name%>. Type 'exit' to exit the program any time." << std::endl;

    std::set<std::string> finalStates;
<%for (i = 0; i < stateMachine.finalStates.length; i += 1) {%>    finalStates.insert("<%=stateMachine.finalStates[i]%>");
<%}%>

    std::string currentStateId = "<%=stateMachine.initialState%>";
    std::string currentState = "<%=initialStateName%>";
    
    std::string currentInput = "";
    while (strcmp(currentInput.c_str(), "exit"))
    {
        std::cout << "Current state: '" << currentState << " (" << currentStateId << ")" << std::endl;
        std::cout << "Enter an event: ";
        std::getline(std::cin, currentInput);
<%for (i = 0; i < stateMachine.states.length; i += 1) {
    var eventStr = '';
    if (stateMachine.states[i].transitions.length === 0) {
        continue;
    }
    innerIf = 'if';%>        <%=outerIf%> (currentStateId == "<%=stateMachine.states[i].id%>")
        {
<%for (j = 0; j < stateMachine.states[i].transitions.length; j += 1) {
    var transition = stateMachine.states[i].transitions[j];
    eventStr += ', ' + transition.event;
%>            <%=innerIf%> (currentInput == "<%=transition.event%>")
            {
                std::cout << "Switching state to <%=transition.targetName%> (<%=transition.targetId%>)" << std::endl;
                currentStateId = "<%=transition.targetId%>";
                currentState = "<%=transition.targetName%>";
            }<%if (j === stateMachine.states[i].transitions.length - 1) {%>
            else
            {
                std::cout << "Possible events for transition(s): <%=eventStr.substring(2)%>" << std::endl;
            }<%}%>
<%innerIf = 'else if';}%>
        }
<%outerIf = 'else if';}%>
        // Break the loop at a final state.
        if (finalStates.find(currentStateId) != finalStates.end())
        {
            std::cout << "At a final state " << currentState << " (" << currentStateId << ")" << std::endl;
            break;
        }
    }
    std::cout << "Press enter to exit" << std::endl;
    std::getline(std::cin, currentInput);

    return 0;
}