#include "test-tool.h"
#include "parse-options.h"
#include "strbuf.h"
#include "string-list.h"
#include "trace2.h"

static int boolean = 0;
static int integer = 0;
static unsigned long magnitude = 0;
static timestamp_t timestamp;
static int abbrev = 7;
static int verbose = -1; /* unspecified */
static int dry_run = 0, quiet = 0;
static char *string = NULL;
static char *file = NULL;
static int ambiguous;

static struct {
	int called;
	const char *arg;
	int unset;
} length_cb;

static int length_callback(const struct option *opt, const char *arg, int unset)
{
	length_cb.called = 1;
	length_cb.arg = arg;
	length_cb.unset = unset;

	if (unset)
		return 1; /* do not support unset */

	*(int *)opt->value = strlen(arg);
	return 0;
}

static int number_callback(const struct option *opt, const char *arg, int unset)
{
	BUG_ON_OPT_NEG(unset);
	*(int *)opt->value = strtol(arg, NULL, 10);
	return 0;
}

static int collect_expect(const struct option *opt, const char *arg, int unset)
{
	struct string_list *expect;
	struct string_list_item *item;
	struct strbuf label = STRBUF_INIT;
	const char *colon;

	if (!arg || unset)
		die("malformed --expect option");

	expect = (struct string_list *)opt->value;
	colon = strchr(arg, ':');
	if (!colon)
		die("malformed --expect option, lacking a colon");
	strbuf_add(&label, arg, colon - arg);
	item = string_list_insert(expect, strbuf_detach(&label, NULL));
	if (item->util)
		die("malformed --expect option, duplicate %s", label.buf);
	item->util = (void *)arg;
	return 0;
}

__attribute__((format (printf,3,4)))
static void show(struct string_list *expect, int *status, const char *fmt, ...)
{
	struct string_list_item *item;
	struct strbuf buf = STRBUF_INIT;
	va_list args;

	va_start(args, fmt);
	strbuf_vaddf(&buf, fmt, args);
	va_end(args);

	if (!expect->nr)
		printf("%s\n", buf.buf);
	else {
		char *colon = strchr(buf.buf, ':');
		if (!colon)
			die("malformed output format, output lacking colon: %s", fmt);
		*colon = '\0';
		item = string_list_lookup(expect, buf.buf);
		*colon = ':';
		if (!item)
			; /* not among entries being checked */
		else {
			if (strcmp((const char *)item->util, buf.buf)) {
				printf("-%s\n", (char *)item->util);
				printf("+%s\n", buf.buf);
				*status = 1;
			}
		}
	}
	strbuf_release(&buf);
}

int cmd__parse_options(int argc, const char **argv)
{
	const char *prefix = "prefix/";
	const char *usage[] = {
		"test-tool parse-options <options>",
		"",
		"A helper function for the parse-options API.",
		NULL
	};
	struct string_list expect = STRING_LIST_INIT_NODUP;
	struct string_list list = STRING_LIST_INIT_NODUP;

	struct option options[] = {
		OPT_BOOL(0, "yes", &boolean, "get a boolean"),
		OPT_BOOL('D', "no-doubt", &boolean, "begins with 'no-'"),
		{ OPTION_SET_INT, 'B', "no-fear", &boolean, NULL,
		  "be brave", PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
		OPT_COUNTUP('b', "boolean", &boolean, "increment by one"),
		OPT_BIT('4', "or4", &boolean,
			"bitwise-or boolean with ...0100", 4),
		OPT_NEGBIT(0, "neg-or4", &boolean, "same as --no-or4", 4),
		OPT_GROUP(""),
		OPT_INTEGER('i', "integer", &integer, "get a integer"),
		OPT_INTEGER('j', NULL, &integer, "get a integer, too"),
		OPT_MAGNITUDE('m', "magnitude", &magnitude, "get a magnitude"),
		OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23),
		OPT_CMDMODE(0, "mode1", &integer, "set integer to 1 (cmdmode option)", 1),
		OPT_CMDMODE(0, "mode2", &integer, "set integer to 2 (cmdmode option)", 2),
		OPT_CALLBACK('L', "length", &integer, "str",
			"get length of <str>", length_callback),
		OPT_FILENAME('F', "file", &file, "set file to <file>"),
		OPT_GROUP("String options"),
		OPT_STRING('s', "string", &string, "string", "get a string"),
		OPT_STRING(0, "string2", &string, "str", "get another string"),
		OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
		OPT_STRING('o', NULL, &string, "str", "get another string"),
		OPT_NOOP_NOARG(0, "obsolete"),
		OPT_SET_INT_F(0, "longhelp", &integer, "help text of this entry\n"
			      "spans multiple lines", 0, PARSE_OPT_NONEG),
		OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
		OPT_GROUP("Magic arguments"),
		OPT_NUMBER_CALLBACK(&integer, "set integer to NUM",
			number_callback),
		{ OPTION_COUNTUP, '+', NULL, &boolean, NULL, "same as -b",
		  PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH },
		{ OPTION_COUNTUP, 0, "ambiguous", &ambiguous, NULL,
		  "positive ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
		{ OPTION_COUNTUP, 0, "no-ambiguous", &ambiguous, NULL,
		  "negative ambiguity", PARSE_OPT_NOARG | PARSE_OPT_NONEG },
		OPT_GROUP("Standard options"),
		OPT__ABBREV(&abbrev),
		OPT__VERBOSE(&verbose, "be verbose"),
		OPT__DRY_RUN(&dry_run, "dry run"),
		OPT__QUIET(&quiet, "be quiet"),
		OPT_CALLBACK(0, "expect", &expect, "string",
			     "expected output in the variable dump",
			     collect_expect),
		OPT_GROUP("Alias"),
		OPT_STRING('A', "alias-source", &string, "string", "get a string"),
		OPT_ALIAS('Z', "alias-target", "alias-source"),
		OPT_END(),
	};
	int i;
	int ret = 0;

	trace2_cmd_name("_parse_");

	argc = parse_options(argc, (const char **)argv, prefix, options, usage, 0);

	if (length_cb.called) {
		const char *arg = length_cb.arg;
		int unset = length_cb.unset;
		show(&expect, &ret, "Callback: \"%s\", %d",
		     (arg ? arg : "not set"), unset);
	}
	show(&expect, &ret, "boolean: %d", boolean);
	show(&expect, &ret, "integer: %d", integer);
	show(&expect, &ret, "magnitude: %lu", magnitude);
	show(&expect, &ret, "timestamp: %"PRItime, timestamp);
	show(&expect, &ret, "string: %s", string ? string : "(not set)");
	show(&expect, &ret, "abbrev: %d", abbrev);
	show(&expect, &ret, "verbose: %d", verbose);
	show(&expect, &ret, "quiet: %d", quiet);
	show(&expect, &ret, "dry run: %s", dry_run ? "yes" : "no");
	show(&expect, &ret, "file: %s", file ? file : "(not set)");

	for (i = 0; i < list.nr; i++)
		show(&expect, &ret, "list: %s", list.items[i].string);

	for (i = 0; i < argc; i++)
		show(&expect, &ret, "arg %02d: %s", i, argv[i]);

	expect.strdup_strings = 1;
	string_list_clear(&expect, 0);
	string_list_clear(&list, 0);

	return ret;
}

static void print_args(int argc, const char **argv)
{
	int i;
	for (i = 0; i < argc; i++)
		printf("arg %02d: %s\n", i, argv[i]);
}

static int parse_options_flags__cmd(int argc, const char **argv,
				    enum parse_opt_flags test_flags)
{
	const char *usage[] = {
		"<...> cmd [options]",
		NULL
	};
	int opt = 0;
	const struct option options[] = {
		OPT_INTEGER('o', "opt", &opt, "an integer option"),
		OPT_END()
	};

	argc = parse_options(argc, argv, NULL, options, usage, test_flags);

	printf("opt: %d\n", opt);
	print_args(argc, argv);

	return 0;
}

static enum parse_opt_flags test_flags = 0;
static const struct option test_flag_options[] = {
	OPT_GROUP("flag-options:"),
	OPT_BIT(0, "keep-dashdash", &test_flags,
		"pass PARSE_OPT_KEEP_DASHDASH to parse_options()",
		PARSE_OPT_KEEP_DASHDASH),
	OPT_BIT(0, "stop-at-non-option", &test_flags,
		"pass PARSE_OPT_STOP_AT_NON_OPTION to parse_options()",
		PARSE_OPT_STOP_AT_NON_OPTION),
	OPT_BIT(0, "keep-argv0", &test_flags,
		"pass PARSE_OPT_KEEP_ARGV0 to parse_options()",
		PARSE_OPT_KEEP_ARGV0),
	OPT_BIT(0, "keep-unknown-opt", &test_flags,
		"pass PARSE_OPT_KEEP_UNKNOWN_OPT to parse_options()",
		PARSE_OPT_KEEP_UNKNOWN_OPT),
	OPT_BIT(0, "no-internal-help", &test_flags,
		"pass PARSE_OPT_NO_INTERNAL_HELP to parse_options()",
		PARSE_OPT_NO_INTERNAL_HELP),
	OPT_BIT(0, "subcommand-optional", &test_flags,
		"pass PARSE_OPT_SUBCOMMAND_OPTIONAL to parse_options()",
		PARSE_OPT_SUBCOMMAND_OPTIONAL),
	OPT_END()
};

int cmd__parse_options_flags(int argc, const char **argv)
{
	const char *usage[] = {
		"test-tool parse-options-flags [flag-options] cmd [options]",
		NULL
	};

	argc = parse_options(argc, argv, NULL, test_flag_options, usage,
			     PARSE_OPT_STOP_AT_NON_OPTION);

	if (!argc || strcmp(argv[0], "cmd")) {
		error("'cmd' is mandatory");
		usage_with_options(usage, test_flag_options);
	}

	return parse_options_flags__cmd(argc, argv, test_flags);
}

static int subcmd_one(int argc, const char **argv, const char *prefix UNUSED)
{
	printf("fn: subcmd_one\n");
	print_args(argc, argv);
	return 0;
}

static int subcmd_two(int argc, const char **argv, const char *prefix UNUSED)
{
	printf("fn: subcmd_two\n");
	print_args(argc, argv);
	return 0;
}

static int parse_subcommand__cmd(int argc, const char **argv,
				 enum parse_opt_flags test_flags)
{
	const char *usage[] = {
		"<...> cmd subcmd-one",
		"<...> cmd subcmd-two",
		NULL
	};
	parse_opt_subcommand_fn *fn = NULL;
	int opt = 0;
	struct option options[] = {
		OPT_SUBCOMMAND("subcmd-one", &fn, subcmd_one),
		OPT_SUBCOMMAND("subcmd-two", &fn, subcmd_two),
		OPT_INTEGER('o', "opt", &opt, "an integer option"),
		OPT_END()
	};

	if (test_flags & PARSE_OPT_SUBCOMMAND_OPTIONAL)
		fn = subcmd_one;
	argc = parse_options(argc, argv, NULL, options, usage, test_flags);

	printf("opt: %d\n", opt);

	return fn(argc, argv, NULL);
}

int cmd__parse_subcommand(int argc, const char **argv)
{
	const char *usage[] = {
		"test-tool parse-subcommand [flag-options] cmd <subcommand>",
		NULL
	};

	argc = parse_options(argc, argv, NULL, test_flag_options, usage,
			     PARSE_OPT_STOP_AT_NON_OPTION);

	if (!argc || strcmp(argv[0], "cmd")) {
		error("'cmd' is mandatory");
		usage_with_options(usage, test_flag_options);
	}

	return parse_subcommand__cmd(argc, argv, test_flags);
}
