#include <stdio.h>
#if defined(VAXTOKEN) || defined(_AIX)
#include <sys/time.h>
#else
#include <time.h>
#endif

#include        "layout.h"
#include	"inet.h"
#include	"db.h"

/*
** allpurpose.c:  Does "statuscheck", "reenroll", and "deenroll"
**
**  argv[1] == 1   :  statuscheck
**  argv[1] == 2   :  reenroll
**  argv[1] == 3   :  deenroll
*/

#define	safestrlen(foo)	((foo) ? strlen(foo) : 0)

Class		selections[MAX_CHOICES];/* course and section names */
ClassPtr	*classlist;
int		classcount = 0;
ForminstancePtr myforminstance;
char		*ReadFile();
char		**stringlist;		/* data for list of classes */
extern	int		sockfd;
int		currentstatus;
int		section;

extern char		*getenv();
extern int		PhSendAuthenticator();
extern int		PhOpenServer();
extern int		PhCloseServer();
extern int		PhSaveChoices();
extern ForminstancePtr	PhGetForm();

char	*username = NULL;
char	*whoami = NULL;

main(argc, argv)
int	argc;
char	*argv[];
{

	int	i;
	int	changemade;

	if (argc < 2 || atoi(argv[1]) <= 0 || atoi(argv[1]) > 3) {
		fprintf (stderr, "usage:  %s [123]\n", argv[0]);
		fprintf (stderr, "1: statuscheck\n");
		fprintf (stderr, "2: reenroll\n");
		fprintf (stderr, "3: deenroll\n");
		exit(0);
        }

	if (argc == 3)
		whoami = argv[2];
		
	if (!PhOpenServer()) {
		fprintf(stderr, "Cannot reach database server.\n");
		exit (-1);
	}

	if (!PhSendAuthenticator()) {
		fprintf (stderr, "Kerberos authentication failed.");
		exit (-1);
	}

	if (!whoami) {
                whoami = getenv ("USER");
        }
        else {
                (void) PhAssumeIdentity(whoami);
        }

        if (!whoami) {
                fprintf(stderr, "Unable to read your username.\n");
                exit(-1);
        }

/*
	myforminstance = PhGetForm("hass-d", whoami, NULL);
*/
	myforminstance = PhGetForm("pelott", whoami);

	if (!myforminstance) {
		fprintf (stderr, "Cannot read record from the database");
		exit (-1);
	}

/*
	GetAssign(myforminstance);
*/

	switch (atoi (argv[1])) {
		case 1:		/* showassign */
			DoStatusCheck();
			break;

		case 2:		/* reenroll */
			changemade = DoReenroll();
			break;

		case 3:		/* deenroll */
			changemade = DoDeenroll();
			break;

	}
/*
	myforminstance = PhGetForm("hass-d", whoami, myforminstance);
*/
	myforminstance = PhGetForm("pelott", whoami);

	if (!myforminstance) {
		fprintf (stderr, "Cannot reread record from the database");
		exit (-1);
	}
	currentstatus = GetVal(myforminstance);

	if (changemade) {
		if (currentstatus) {
			printf ("Thank you for deenrolling from your physical education class.  You have made\n");
			printf ("a space available for another student.  If you wish to reenroll, you may\n");
			printf ("run 'reenroll' until 12:00 noon on January 27th.\n");
		}
		else {
			printf ("The Physical education lottery program has reinstated you in your assigned class.\n");
		}
	}
	else {
		printf ("No changes to your status were made\n");
	}

	PhCloseServer();
}

DoStatusCheck()
{
	char	sendline[MAXLINE+1], recvline[MAXLINE+1];
	int	i;

	currentstatus = GetVal(myforminstance);
	if (!currentstatus) {
/*
		printf ("You have not requested to be deenrolled from your assigned class.\n");
*/
	}
	else {
		printf ("You have requested to be DEENROLLED from your assigned class.\n");
		printf ("If you wish to reenroll, you may run 'reenroll' until\n");
		printf ("12:00 noon on January 27th.\n");
	}
	sprintf (sendline, "showassign\n");
	i = SendLine(sendline, recvline);
/*
	if (i != 1) {
		ErrorMessage (recvline);
		return (NULL);
	}
*/
	printf ("A copy of your assignment message has been mailed to you.\n");
	exit(0);
}

DoReenroll()
{
	currentstatus = GetVal(myforminstance);
	if (!currentstatus) {
		printf ("You are currently enrolled anyway.\n");
		return (0);
	}
	SetFlag("false");
	return (1);
}

DoDeenroll()
{
	currentstatus = GetVal(myforminstance);
	if (currentstatus) {
		printf ("You are already deenrolled.\n");
		return (0);
	}
	SetFlag("true");
	return (1);
}



SetFlag(flag)
char	*flag;
{
	int	i;
	char	sendline[MAXLINE+1], recvline[MAXLINE+1];

	sprintf (sendline, "put %s %s (2)\n", 
			myforminstance->class->formname, whoami);
	i = SendLine(sendline, recvline);
	if (i != 1) {
		ErrorMessage (recvline);
		return (NULL);
	}
	sprintf (sendline, "deenroll %s\n", flag);
	i = SendLine(sendline, recvline);
	if (i != 1) {
		ErrorMessage (recvline);
		return (NULL);
	}

	sprintf (sendline, "messagesent false\n");
	i = SendLine(sendline, recvline);
	if (i != 1) {
		ErrorMessage (recvline);
		return (NULL);
	}
}



Confirm(message)
char	*message;
{
	fprintf (stderr, "Confirm: %s\n", message);
	return (1);
}

ErrorMessage(message)
char	*message;
{
	fprintf (stderr, "ErrorMessage: %s\n", message);
}

GetVal(myfi)
ForminstancePtr myfi;
{
	BooleanInputPtr         mybooleaninput;
	InputFieldPtr	myinput;
	FieldPtr	myfield;
	FormclassPtr		class;

	class = myfi->class;
	myfield = FindFieldByName("deenroll", class);
	if (myfield == NULL) {
		fprintf (stderr, "Cannot find the deenroll field in database.");
		exit (-1);
	}
	myinput = myfield->detail->inputptr;
	mybooleaninput = myinput->inputsource->boolean;
	return (mybooleaninput->data);
/*
	fprintf (stderr, "Value of deenroll is %s\n", mybooleaninput->data ? "true" : "false");
*/
}

/*
GetAssign(forminstance)
ForminstancePtr forminstance;
{
	int		i;
	FieldPtr	myfield;
	TextInputPtr            mytextinput;
	NumericInputPtr         mynumericinput;
	FormclassPtr		class;

	class = forminstance->class;

	myfield = FindFieldByName("coursea", class);
	if (!myfield) {
		fprintf (stderr, "Cannot locate course field in database\n");
		exit (-1);
	}
	mytextinput = myfield->detail->inputptr->inputsource->text;

	myfield = FindFieldByName("sectiona", class);
	if (!myfield) {
		fprintf (stderr, "Cannot locate section field in database\n");
		exit (-1);
	}
	mynumericinput = myfield->detail->inputptr->inputsource->numeric;

	section = mynumericinput->data;
	if (mytextinput->data)
		strcpy (coursename, mytextinput->data);
	else
		strcpy (coursename, "");
}
*/
