/*	Eric Knibbe
*	CS 232 - Operating Systems, Spring '06
*	Project 1.5
*	prank.cpp
*	Note: there's no need for a "command line" switch - if it has any arguments 
*	at all, it'll use the command line view; otherwise, it'll use the other view/
*/

#include <string.h>
#include <iostream>
using namespace std;
#include "Prank.h"

//method declarations
void view_commandline(int, char **);
void view_menuinterface();
void send_signal();

//global variables
int message_interval;
bool disable_interrupts;
static const char *disable_interrupts_switch = "-i";
static const char *enable_interrupts_switch = "+i";
static const char *custom_interval_switch = "+t";

//main method
int main (int argc, char *argv[]) {
	if (argc > 1) {					//if any arguments are included, use the command line view
		cout << "using command line" << endl;
		view_commandline(argc, argv);
	} else {
		cout << "using menu interface" << endl;
		view_menuinterface();
	}
	return 0;
}

void send_signal() {
	signal(SIGALRM, alarm_handler);
	if (dInterrupts) {
		signal(SIGINT, interrupt_handler);
	}
	alarm(mInterval);
	while(true);
}

//command-line view
void view_commandline(int argc, char **argv) {
	disable_interrupts = true;
	message_interval = 0;
	int i;
	for (i = 1; i < argc; i++) {
		if (!strcmp(argv[i], disable_interrupts_switch)) {
			disable_interrupts = true;
		}
		if (!strcmp(argv[i], enable_interrupts_switch)) {
			disable_interrupts = false;
		}
		if (!strcmp(argv[i], custom_interval_switch)) {
			message_interval = atoi(argv[i + 1]);
			i++;
		}
	}
	if (message_interval == 0) {
		Prank prank1(disable_interrupts);
		send_signal();
	} else {
		Prank prank1(disable_interrupts, message_interval);
		send_signal();
	}
}

//menu-driven view
void view_menuinterface() {
	char interrupts_response;
	do {
		cout << "Every how many seconds would you like the message to appear? Enter a number (0 for default): ";
		cin >> message_interval;
		if (!cin) {
			cerr << "You really screwed up this time." << endl;
			exit(1);
		}
		if (message_interval < 0) {
			cout << "Only enter a number greater than 0.";
		}
	} while (message_interval < 0);
	cout << "Would you like to disable interrupts? (y/n) ";
	cin >> interrupts_response;
	if (!cin) {
		cerr << "You really screwed up this time." << endl;
		exit(1);
	}
	if (interrupts_response == 'Y' || interrupts_response == 'y') {
		disable_interrupts = true;
	} else {
		disable_interrupts = false;
	}
	if (message_interval == 0) {
		cout << "Showing message for the default interval. " << endl;
	} else {
		cout << "Showing message every " << message_interval << " seconds. " << endl;
	}
	if (disable_interrupts) { 
		cout << "Interrupts are disabled.\n";
	} else {
		cout << "Interrupts are not disabled.\n";
	}
	if (message_interval == 0) {
		Prank prank1(disable_interrupts);
		send_signal();
	} else {
		Prank prank1(disable_interrupts, message_interval);
		send_signal();
	}
}

