/* Main alarm routine(s) for EngClock */

//#include <proto/exec.h>
#include <intuition/intuition.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <proto/locale.h>
//#include <proto/intuition.h>

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <utility/date.h>

#include <proto/utility.h>

#include "prefs.h"

extern void msg(char *msg);
extern BOOL talk(char *text);
extern BOOL playsam(char *esvxname);
extern char *trans(char *text);
ULONG findday(int preset2);
extern void gettime(void);
extern void shutdown_mod(void);
extern void startmod(char *name);

extern int memmins, memhours;

extern struct IntuiText req_text;
extern struct IntuiText ok_text;
extern struct Catalog *catalog;

extern struct Prefs prefs;

extern struct {
/* Time structure, set up by gettime() and used globally */

   int hours;        /* Number of hours since midnight on system clock */
   int seconds;      /* Number of seconds */
   int minutes;      /* Number of minutes */
   int years;        /* Current year */
   int days;         /* Date in current month */
   int months;       /* Current month */
   int wday;         /* Day in the week 0-6 (starting Sunday) */
}time;


void process_alarm(void) {
	int i; BOOL flg=FALSE;



	/* Re-init the time structure */
	gettime();
	
	//for(i=1; i<11; i++) 
		//printf("Event %d, freq: %d\n",i,prefs.events[i].freq);
	for(i=1; i<=10; i++) {
		if(prefs.events[i].used) {
			switch(prefs.events[i].freq) {
				case 0: /* Daily */
					flg=TRUE;
				break;
				case 1: /* Once */
					if(prefs.events[i].day==time.days) {
						if(prefs.events[i].month==time.months) {
							if(prefs.events[i].year==time.years) {
								flg=TRUE;
							}
						}
					}
				break;
				case 2: /* Weekly */
					if(findday(i)==time.wday) 
					flg=TRUE;
				break;
				case 3: /* Monthly */
					if(prefs.events[i].day==time.days)
						flg=TRUE;
				break;
				case 4: /* Yearly */
					if(prefs.events[i].day==time.days) {
						if(prefs.events[i].month==time.months) {
							flg=TRUE;
						}
					}
				break;
				case 5: /* Weekdays */
					if(time.wday!=0 && time.wday!=6)
						flg=TRUE;
				break;
				case 6: /* Weekends */
					if(time.wday==0 || time.wday==6)
						flg=TRUE;
				break;
				default:
				break;
			}
			if(prefs.events[i].minutes==time.minutes) {
				if(prefs.events[i].hours==time.hours) {
					if(flg) {
						if(!(time.minutes==memmins && time.hours==memhours)) {
							switch(prefs.events[i].type) {
								case 0:  /* Req */
									req_text.IText=prefs.events[i].message;
									ok_text.IText=GetCatalogStr(catalog,27,"Sure!");
									AutoRequest(NULL,&req_text,NULL,&ok_text,NULL,NULL,320,100);
								break;	
								case 1:	/* Sound */
									playsam(prefs.events[i].message);
								break;
								case 2:	/* Command */
									system(prefs.events[i].message);
								break;
								case 3:	/* Talk */
									talk(trans(prefs.events[i].message));
								break;
								case 4: /* Module */
									shutdown_mod();
									startmod(prefs.events[i].message);
								break;
								default:
									msg("Unknown event type!");
								break;
							}
						}
					}
				}
			}	
		}
	flg=FALSE; /* Remeber to set this back again dickbrains */
	}
	memmins=time.minutes;
	memhours=time.hours;
}


ULONG findday(int preset2) {
	ULONG secs;
	struct ClockData clock;
	
	memset(&clock,0,sizeof(struct ClockData));
	
	clock.sec=0;
	clock.hour=0;
	clock.min=0;
	clock.year=prefs.events[preset2].year;
	clock.month=prefs.events[preset2].month;
	clock.mday=prefs.events[preset2].day;
	
	secs=Date2Amiga(&clock);
	Amiga2Date(secs,&clock);
	
	return(clock.wday);
}