/*
	PROGRAM:  BGP Simulation Program
	AUTHOR:   Ryan Reed

*/

#include "stdafx.h"

void printmain();


int _tmain()
{
	char state = 'A';
	int event = 50;	// Random number to initialize the event

	printf("\n");
	printf("\t*********************************\n");
	printf("\t*     BGP SIMULATION PROGRAM\t*\n");
	printf("\t* \t    Created by\t\t*\n");
	printf("\t* \tRyan Reed, Patrick Dyl,\t*\n");
	printf("\t* \tand Chris McDowell \t*\n");
	printf("\t*********************************\n\n");


	while (event != 99) // Loop the program
	{
		printf("\t Enter 0 for events list. \n");
		printf("\t Enter 99 to exit. \n");
		printf("\t Current state is State %c \n", state);
		printf("\t Enter an event:  ");
		scanf("%d", &event);

		if (event == 0)	// Outputs the events list
			printmain();
		else
		{
			switch(state)
			{
				// STATE A - IDLE
				case 'A':
					switch(event)
					{
						case 1:
							printf("\n\t REQUEST FOR CONNNECTION SENT\n");
							printf("\t Transitioning to 'Active' State\n\n");
							state = 'B';
							break;
						case 13:
						case 3:
							printf("\n\t CLOSE CONNECTION SENT\n");
							printf("\t No State Transition\n\n");
							break;
						case 2:
							printf("\n\t CONNECTION SUCCEEDED\n");
							printf("\t Transitioning to 'Connect' State\n\n");
							state = 'E';
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State A
					break;
				
				// In memory of William Walker
				// STATE B - ACTIVE
				case 'B':
					switch(event)
					{
						case 13:
							printf("\n\t CLOSE CONNECTION SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 14:
							printf("\n\t 'OPEN' SENT\n");
							printf("\t Transition to 'Open Sent' State\n\n");
							state = 'C';
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State B
					break;

				// STATE C - OPEN SENT
				case 'C':
					switch(event)
					{
						case 4:
							printf("\n\t 'KEEP ALIVE' SENT\n");
							printf("\t Transition to 'Open Confirmed' State\n\n");
							state = 'D';
							break;
						case 7:
							printf("\n\t 'CLOSE CONNECTION' SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 13:
							printf("\n\t 'NOTIFICATION' SENT\n");
							printf("\t 'CLOSE CONNECTION' SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State C
					break;
					
				// STATE D - OPEN CONFIRMED
				case 'D':
					switch(event)
					{
						case 5:
							printf("\n\t 'KEEP ALIVE' RECEIVED\n");
							printf("\t Transition to 'Established' State\n\n");
							state = 'F';
							break;
						case 7:
							printf("\n\t CLOSE CONNECTION SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 13:	
							printf("\n\t 'NOTIFICATION' SENT\n");
							printf("\t 'CLOSE CONNECTION' SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State D
					break;

				// STATE E - CONNECT
				case 'E':
					switch(event)
					{
						case 4:
							printf("\n\t 'OPEN' RECEIVED\n");
							printf("\t 'KEEP ALIVE' SENT\n");
							printf("\t Transition to 'Open Confirmed' State\n\n");
							state = 'D';
							break;
						case 13:
							printf("\n\t CLOSE CONNECTION SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State E
					break;
				
				// STATE F - ESTABLISHED
				case 'F':
					switch(event)
					{
						case 6:
							printf("\n\t 'UPDATE' RECEIVED\n");
							printf("\t Transition to 'Established' State\n\n");
							state = 'F';
							break;
						case 7:
							printf("\n\t CLOSE CONNECTION SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 13:
							printf("\n\t 'NOTIFICATION' SENT\n");
							printf("\t 'CLOSE CONNECTION' SENT\n");
							printf("\t Transition to 'Idle' State\n\n");
							state = 'A';
							break;
						case 14:
							printf("\n\t 'UPDATE' SENT\n");
							printf("\t No State Transition\n\n");
							break;
						case 99:
							printf("\n\t GOODBYE\n\n");
							break;
						default:
							printf("\n\t INVALID EVENT FOR CURRENT STATE\n\n");
							break;
					} // End State F
						

			} // End Switch Statement
		} // End If / Else Statement
	} // End While Loop
	return 0;
} // End Program

// Print's main events list
void printmain()
{
	printf("\n");
	printf("\t*********************************\n");
	printf("\t*     Events and Actions List\t*\n");
	printf("\t*\t\t\t\t*\n");
	printf("\t*  1.) Request for Connection \t*\n");
	printf("\t*  2.) Connection Succeeded \t*\n");
	printf("\t*  3.) Connection Failed \t*\n");
	printf("\t*  4.) 'Open Recieved' \t\t*\n");
	printf("\t*  5.) 'KeepAlive' Recieved\t*\n");
	printf("\t*  6.) 'Update' Recieved\t*\n");
	printf("\t*  7.) 'Notification' Recieved\t*\n");
	printf("\t*  8.) 'Open' Sent\t\t*\n");
	printf("\t*  9.) 'KeepAlive' Sent\t\t*\n");
	printf("\t* 10.) 'Update' Sent\t\t*\n");
	printf("\t* 11.) 'Notification' Sent\t*\n");
	printf("\t* 12.) Close Connection\t\t*\n");
	printf("\t* 13.) Any Error\t\t*\n");
	printf("\t* 14.) No Event\t\t\t*\n");
	printf("\t*\t\t\t\t*\n");
	printf("\t*********************************\n\n");
}