/*
** rmm.c -- remove a message(s)
**
** This code is Copyright (c) 2002, by the authors of nmh.  See the
** COPYRIGHT file in the root directory of the nmh distribution for
** complete copyright information.
*/

#include <h/mh.h>
#include <h/utils.h>
#include <unistd.h>
#include <locale.h>
#include <sysexits.h>

static struct swit switches[] = {
#define UNLINKSW  0
	{ "unlink", 0 },
#define NUNLINKSW  1
	{ "nounlink", 2 },
#define VERSIONSW  2
	{ "Version", 0 },
#define HELPSW  3
	{ "help", 0 },
	{ NULL, 0 }
};

char *version=VERSION;

int
main(int argc, char **argv)
{
	int msgnum, unlink_msgs = 0, vecp = 0;
	char *cp, *maildir, *folder = NULL, **vec;
	char buf[BUFSIZ], **argp;
	char **arguments;
	struct msgs_array msgs = { 0, 0, NULL };
	struct msgs *mp;

	setlocale(LC_ALL, "");
	invo_name = mhbasename(argv[0]);

	context_read();

	arguments = getarguments(invo_name, argc, argv, 1);
	argp = arguments;

	/* parse arguments */
	while ((cp = *argp++)) {
		if (*cp == '-') {
			switch (smatch(++cp, switches)) {
			case AMBIGSW:
				ambigsw(cp, switches);
				exit(EX_USAGE);
			case UNKWNSW:
				adios(EX_USAGE, NULL, "-%s unknown\n", cp);

			case HELPSW:
				snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name);
				print_help(buf, switches, 1);
				exit(argc == 2 ? EX_OK : EX_USAGE);
			case VERSIONSW:
				print_version(invo_name);
				exit(argc == 2 ? EX_OK : EX_USAGE);

			case UNLINKSW:
				unlink_msgs++;
				continue;
			case NUNLINKSW:
				unlink_msgs = 0;
				continue;
			}
		}
		if (*cp == '+' || *cp == '@') {
			if (folder) {
				adios(EX_USAGE, NULL, "only one folder at a time!");
			} else {
				folder = mh_xstrdup(expandfol(cp));
			}
		} else {
			app_msgarg(&msgs, cp);
		}
	}

	if (!msgs.size) {
		app_msgarg(&msgs, seq_cur);
	}
	if (!folder) {
		folder = getcurfol();
	}
	maildir = toabsdir(folder);

	if (chdir(maildir) == NOTOK) {
		adios(EX_OSERR, maildir, "unable to change directory to");
	}

	/* read folder and create message structure */
	if (!(mp = folder_read(folder))) {
		adios(EX_IOERR, NULL, "unable to read folder %s", folder);
	}
	if (mp->nummsg == 0) {
		adios(EX_DATAERR, NULL, "no messages in %s", folder);
	}
	/*
	** parse all the message ranges/sequences and set SELECTED
	** (We do this for the refiling case as well, to complain
	** about invalid msg arguments in rmm, before we call refile.)
	*/
	for (msgnum = 0; msgnum < msgs.size; msgnum++) {
		if (!m_convert(mp, msgs.msgs[msgnum])) {
			exit(EX_USAGE);
		}
	}

	context_replace(curfolder, folder);
	context_save();

	if (unlink_msgs) {
		/* "remove" the SELECTED messages */
		folder_delmsgs(mp, 1);
		seq_setprev(mp);
		seq_save(mp);
		folder_free(mp);
		return 0;
	}

	/* remove by refiling. */

	folder_free(mp);
	fflush(stdout);

	if (msgs.size+6 > MAXARGS) {
		adios(EX_SOFTWARE, NULL, "more than %d messages for refile exec",
				MAXARGS - 6);
	}
	vec = mh_xcalloc(msgs.size + 6, sizeof(*vec));
	vec[vecp++] = "refile";
	vec[vecp++] = "-src";
	vec[vecp++] = concat("+", folder, NULL);
	vec[vecp++] = "-nolink";
	vec[vecp++] = concat("+", trashfolder, NULL);
	for (msgnum = 0; msgnum < msgs.size; msgnum++) {
		vec[vecp++] = msgs.msgs[msgnum];
	}
	vec[vecp] = NULL;

	return execprog(*vec, vec);
}
