/*Program to calculate your bioryhms*/
/*written by S.J.R.*/


#include <curses.h>
#include <signal.h>
#include "defs.h"
#include "globs.h"

main ()
{
	int     finished = FALSE, catch();

	signal(SIGINT, catch);

	initscr ();
	cbreak ();

	todays_date ();
	while (!finished) {
		erase ();
		printw ("Biorhythms by S.J.Raybould\n\n");
		printw ("Do you require instructions ? ");
		printw ("(Y/N or E to end) ");
		refresh ();
		switch (getch()) {
		case 'e':
		case 'E':
			finished = TRUE;
			break;
		case 'y':
		case 'Y':
			instructions ();
		default :
			play ();
			break;
		}
	}
	endwin ();
}


play ()
{
	int     Bday, Bmonth, Byear;/* Birth day,month and year */
	int     Sday, Smonth, Syear;/* Start day,month and year */
	int     start;
	int     ok;

	erase ();

	printw ("First of all the dates must be entered.\n\n");
	ok = NO;
	while (!ok)
	{
		move (10, 0);
		printw ("please enter your birthdate    (DD,MM,YYYY)\n");
		printw ("Birthdate : ");
		clrtoeol ();
		refresh ();
		if (rd_dte (&Bday, &Bmonth, &Byear)) {	/* read date of birth */
			move (11, 0);
			printw ("Birthdate : %2d,%2d,%4d\n", Bday, Bmonth, Byear);
			printw ("                                \n");
			ok = YES;
		} else {
			printw ("Please re-enter birth date.\n");
			refresh ();
			beep ();
			sleep (1);
		}
	}
	ok = NO;
	while (!ok)
	{
		move (13, 0);
		printw ("please enter the starting date");
		printw (" (or press ");
		attrset (A_UNDERLINE);
		printw ("RETURN");
		attrset (0);
		printw (" for today.)\nStartdate : ");
		clrtoeol ();
		refresh ();
		if (rd_dte (&Sday, &Smonth, &Syear))/* read starting date */
		{
			move (14, 0);
			printw ("Startdate : %2d,%2d,%4d\n", Sday, Smonth, Syear);
			printw ("                                \n");
			ok = YES;
		}
		else if (Sday == 0 && Smonth == 0 && Syear == 0)
		{
			move (14, 0);
			Sday = today;
			Smonth = this_month;
			Syear = this_year;
			ok = YES;
			printw ("Startdate : %2d,%2d,%4d\n", Sday, Smonth, Syear);
			printw ("                                \n");
		} else {
			printw ("Please re-enter starting date.\n");
			refresh ();
			beep ();
			sleep (1);
		}
	}

	start = days_passed (Sday, Bday, Smonth, Bmonth, Syear, Byear);

	move (17, 25);
	noecho ();
	attrset (A_REVERSE);
	printw ("PRESS ANY KEY TO DRAW CHART");
	attrset (0);
	refresh ();
	getch ();
	echo ();
	disp_chart (start, day_of_the_year (Sday, Smonth, Syear), Syear);

}


days_passed (sd, bd, sm, bm, sy, by)
int     bd, bm, by, sd, sm, sy;
{
	int     days;
	int     sdy, bdy;		/* starting & birth day of the year */

	if (sd == bd && sm == bm && sy == by)
		return (0);

	sdy = day_of_the_year (sd, sm, sy);
	bdy = day_of_the_year (bd, bm, by);

	days = (sdy - bdy);
	while (sy > by)
	{
		days += 365;
		days += (by % 4 == 0 && by % 100 != 0 || by % 400 == 0);
		++by;
	}
	return (days);
}


day_of_the_year (day, month, year)
int     day, month, year;
{
	int     leap, i = 1;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
	while (i < month)
		day += monlen[leap][i++];
	return (day);
}



rd_dte (ddptr, mmptr, yyptr)
int    *ddptr, *mmptr, *yyptr;
{
	getstr(date_string);
	if(date_string[0] == '\0') {
		*ddptr = *mmptr = *yyptr = 0;
		return(NO);
	}
	sscanf(date_string, "%d,%d,%d\n", ddptr, mmptr, yyptr);
	if (*yyptr < 100) *yyptr += 1900;
	if (*ddptr<1||*ddptr>31||*mmptr<1||*mmptr>12||*yyptr<1800||*yyptr>3000)
		return(NO);

	return (YES);
}

date (dayno, styr, monptr)
int     dayno, styr;
int    *monptr;

{
	int     leap, month = 1;

	leap = styr % 4 == 0 && styr % 100 != 0 || styr % 400 == 0;
	while (dayno > monlen[leap][month])
		dayno -= monlen[leap][month++];

	*monptr = month;
	return (dayno);
}


pr_dte (date, col, month)
int     date, col, month;
{
	if (month > 12)
		month = 1;
	attrset (A_REVERSE);
	move (20, col);
	addch ((date / 10) + '0');
	move (21, col);
	addch ((date % 10) + '0');
	attrset (0);
	if (date == 1)
	{
		move (22, col);
		addstr (mon_name[month]);
	}
}

catch()
{
	endwin();
	exit(1);
}

#ifdef AMIGA
sleep(n)
{
	Delay(n * 50);
}
#endif
