/* cmd.c   by Michael Thorpe   2003-07-04 */

#include <string.h>
#include <time.h>
#include <unistd.h>
#include "imapd.h"

void do_openmailbox(str *tag,str **args,int readonly) {
	if(curmailbox) {
		curmailbox->func->close(curmailbox);
		curmailbox=0;
	}
	curmailbox=open_mailbox(args[0],readonly);
	if(!curmailbox) {
		state=STATE_AUTH;
		writetagstrerr(tag,"NO");
		return;
	}
	state=STATE_SELECT;
	curmailbox->func->refresh(curmailbox);
	writestrnumstr("* ",curmailbox->nummsgs," EXISTS");
	writestrnumstr("* ",curmailbox->numnew," RECENT");
	writestrnumstr("* OK [UIDVALIDITY ",(time(0)<<10)+getpid(),"] UIDs are an unbelievably stupid idea");
	writeallstdout("* FLAGS (\\Deleted \\Draft \\Flagged \\Recent \\Replied \\Seen)\r\n",59);
	if(curmailbox->flags&MAILBOX_READONLY)
		writetagstr(tag,"OK SELECT completed");
	else
		writetagstr(tag,"OK [READ-WRITE] SELECT completed");
}

void cmd_authenticate(str *tag,str **args) {
	writetagstr(tag,"NO unsupported authentication mechanism");
}

void cmd_capability(str *tag,str **args) {
	writeallstdout("* CAPABILITY IMAP4\r\n",20);
	writetagstr(tag,"OK CAPABILITY completed");
}

void cmd_close(str *tag,str **args) {
	int errors=0;

	if(curmailbox) {
		errors=curmailbox->func->sync(curmailbox,0);
		curmailbox->func->close(curmailbox);
		curmailbox=0;
	}
	if(errors)
		writetagstr(tag,"OK CLOSE completed");
	else
		writetagstrerr(tag,"NO");
}

void cmd_examine(str *tag,str **args) {
	do_openmailbox(tag,args,1);
}

void cmd_list(str *tag,str **args) {
/* FIXME: Right now it's just hardwired to the inbox */
	if(args[0]->len) {
/* FIXME: TBW */
	} else if(!args[1]->len) {
		writeallstdout("* LIST (\\Noselect) \"/\" \"\"\r\n",27);
	} else {
/* FIXME: This needs to use pattern-matching */
		if((args[1]->len==1 && args[1]->s[0]=='*') ||
		   (args[1]->len==5 && !strncasecmp(args[1]->s,"INBOX",5))) {
			writeallstdout("* LIST (\\NoInferiors) NIL INBOX\r\n",33);
		} else {
/* FIXME: TBW */
		}
	}
	writetagstr(tag,"OK LIST completed");
}

void cmd_login(str *tag,str **args) {
	unsigned int timeleft;

	timeleft=alarm(0);
	if(login(args[0],args[1])) {
		if(timeleft>1) {
			alarm(timeleft-1);
		} else {
			alarm(1);
			writeallstdout("* BYE IMAP4 server terminating connection\r\n",43);
			state=STATE_LOGOUT;
		}
		writetagstr(tag,"NO LOGIN invalid username/password");
	} else {
		state=STATE_AUTH;
		writetagstr(tag,"OK LOGIN completed");
	}
}

void cmd_logout(str *tag,str **args) {
	writeallstdout("* BYE IMAP4 server terminating connection\r\n",43);
	writetagstr(tag,"OK LOGOUT completed");
	state=STATE_LOGOUT;
}

void cmd_lsub(str *tag,str **args) {
/* FIXME: Right now it's just hardwired to the inbox */
	writetagstr(tag,"OK LSUB completed");
}

void cmd_noop(str *tag,str **args) {
	if(curmailbox->func->refresh(curmailbox)) {
		writestrnumstr("* ",curmailbox->nummsgs," EXISTS");
		writestrnumstr("* ",curmailbox->numnew," RECENT");
	}
	writetagstr(tag,"OK NOOP completed");
}

void cmd_select(str *tag,str **args) {
	do_openmailbox(tag,args,0);
}

