/* ==== main.c ============================================================
 * (C) 1995 Chris Provenzano
 *
 * Description : filecabnit 
 *				 An interactive data storage/retrieval system.
 *
 * 95/06/28 proven - Started coding
 */

#include <stdio.h>
#include <errno.h>
#include "util.h"
#include "fc.h"

/* ==========================================================================
 * usage();
 */
void usage(void)
{
	printf("fc [-D?] [-d <directory>]\n");
	errno = 0;
}

int main(int argc, char **argv)
{
	struct fc fc = FC_INITIALIZER;
	Boolean dir_set = FALSE;
	char * dir_str = FC_DIR;
	char word[256];
	int debug;

	/* Getopt variables. */
	extern int optind, opterr;
	extern char *optarg;

	while ((word[0] = getopt(argc, argv, "d:D?")) != (char)EOF) {
		switch (word[0]) {
		case 'd':
			dir_str = optarg;
			dir_set = TRUE;
			break;
		case 'D':
			debug++;
			break;
		case '?':
			usage();
			return(0);
		default:
			usage();
			goto main_error;
		}
	}

    if (chdir(dir_str)) {
		if (dir_set || mkdir(dir_str, 0755) || chdir(dir_str)) {
			fprintf(stderr, "Couldn't cd into %s\n", dir_str);
			return(1);
		}
	}
	if (fc_init(&fc) < OK) {
		return(1);
	}
	fc_done(&fc, 0);

    fflush(stdin);
    setbuf(stdin, NULL);
    while ((printf("-->") != EOF) && (fgets(word, 255, stdin))) {
		char * subword = word;
		char * subargs = NULL;

		for(subword = word; *subword && isspace(*subword); subword++);
		if (*subword) {
			for(subargs = subword; *subargs && !isspace(*subargs); subargs++);
			if (*subargs) {
				for(*subargs++ = '\0'; *subargs && isspace(*subargs);subargs++);
			}
			if (!strcmp(subword, "ak")) {	/* Add a key */
				fc_do_ak(&fc, subargs);		/* Alias:mk:mkkey */
				continue;
			}
			if (!strcmp(subword, "lk")) {	/* List keys */
				fc_do_lk(&fc, subargs);		/* Alias:ls */
				continue;
			}
			if (!strcmp(subword, "rk")) {	/* Remove a keys */
				fc_do_rk(&fc, subargs);		/* Alias:dk:rmkey */
				continue;
			}
			if (!strcmp(subword, "alk")) {	/* Add to list keys */
				fc_do_alk(&fc, subargs);	/* Alias:cd <key> */
				continue;
			}
			if (!strcmp(subword, "llk")) {	/* List the listkeys */
				fc_do_llk(&fc, subargs);	/* Alias:pwd */
				continue;
			}
			if (!strcmp(subword, "rlk")) {	/* Remove from listkeys */
				fc_do_rlk(&fc, subargs);	/* Alias:cd ... */
				continue;
			}
		    if (!strcmp(subword, "af")) {	/* Add a file */
				fc_do_af(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "lf")) {	/* List files */
				fc_do_lf(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "rf")) {	/* Remove files */
				fc_do_rf(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "afk")) {	/* Add file key */
				continue;
			}
		    if (!strcmp(subword, "lfk")) {	/* List file keys */
				fc_do_lfk(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "rfk")) {	/* Remove file key */
				continue;
			}
		    if (!strcmp(subword, "ag")) {	/* Add a group */
				fc_do_ag(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "lg")) {	/* List groups */
				fc_do_lg(&fc, subargs);		
				continue;
			}
		    if (!strcmp(subword, "rg")) {	/* Remove group */
				fc_error(subword, fc_do_rg(&fc, subargs));		
				continue;
			}
		    if (!strcmp(subword, "agk")) {	/* Add a group */
				fc_error(subword, fc_do_agk(&fc, subargs));
				continue;
			}
		    if (!strcmp(subword, "lgk")) {	/* Add a group */
				fc_error(subword, fc_do_lgk(&fc, subargs));
				continue;
			}
		    if (!strcmp(subword, "rgk")) {	/* Add a group */
				fc_error(subword, fc_do_rgk(&fc, subargs));
				continue;
			}
			if (!strncmp(subword, "save", strlen(subword))) {
				fc_done(&fc, 0);
				continue;
			}
			if ((!strncmp(subword, "help", strlen(subword))) ||
			  (!strcmp(subword, "?"))) {
				fc_help();
				continue;
			}
			if ((!strncmp(subword, "exit", strlen(subword))) ||
			  (!strncmp(subword, "quit", strlen(subword)))) {
				break;
			}
			printf("Unknown command %s\n", subword);
		} 
	}
	if (fc_done(&fc, 1) < OK) {
		return(1);
	}
	return(0);

main_error:;
	return(1);
}
