#include "test-tool.h"
#include "parse.h"
#include "parse-options.h"

static char const * const env__helper_usage[] = {
	"test-tool env-helper --type=[bool|ulong] <options> <env-var>",
	NULL
};

enum cmdmode {
	ENV_HELPER_TYPE_BOOL = 1,
	ENV_HELPER_TYPE_ULONG
};

static int option_parse_type(const struct option *opt, const char *arg,
			     int unset)
{
	enum cmdmode *cmdmode = opt->value;

	BUG_ON_OPT_NEG(unset);

	if (!strcmp(arg, "bool"))
		*cmdmode = ENV_HELPER_TYPE_BOOL;
	else if (!strcmp(arg, "ulong"))
		*cmdmode = ENV_HELPER_TYPE_ULONG;
	else
		die("unrecognized --type argument, %s", arg);

	return 0;
}

int cmd__env_helper(int argc, const char **argv)
{
	int exit_code = 0;
	const char *env_variable = NULL;
	const char *env_default = NULL;
	int ret;
	int ret_int, default_int;
	unsigned long ret_ulong, default_ulong;
	enum cmdmode cmdmode = 0;
	struct option opts[] = {
		OPT_CALLBACK_F(0, "type", &cmdmode, "type",
			       "value is given this type", PARSE_OPT_NONEG,
			       option_parse_type),
		OPT_STRING(0, "default", &env_default, "value",
			   "default for git_env_*(...) to fall back on"),
		OPT_BOOL(0, "exit-code", &exit_code,
			 "be quiet only use git_env_*() value as exit code"),
		OPT_END(),
	};

	argc = parse_options(argc, argv, NULL, opts, env__helper_usage,
			     PARSE_OPT_KEEP_UNKNOWN_OPT);
	if (env_default && !*env_default)
		usage_with_options(env__helper_usage, opts);
	if (!cmdmode)
		usage_with_options(env__helper_usage, opts);
	if (argc != 1)
		usage_with_options(env__helper_usage, opts);
	env_variable = argv[0];

	switch (cmdmode) {
	case ENV_HELPER_TYPE_BOOL:
		if (env_default) {
			default_int = git_parse_maybe_bool(env_default);
			if (default_int == -1) {
				error("option `--default' expects a boolean value with `--type=bool`, not `%s`",
				      env_default);
				usage_with_options(env__helper_usage, opts);
			}
		} else {
			default_int = 0;
		}
		ret_int = git_env_bool(env_variable, default_int);
		if (!exit_code)
			puts(ret_int ? "true" : "false");
		ret = ret_int;
		break;
	case ENV_HELPER_TYPE_ULONG:
		if (env_default) {
			if (!git_parse_ulong(env_default, &default_ulong)) {
				error("option `--default' expects an unsigned long value with `--type=ulong`, not `%s`",
				      env_default);
				usage_with_options(env__helper_usage, opts);
			}
		} else {
			default_ulong = 0;
		}
		ret_ulong = git_env_ulong(env_variable, default_ulong);
		if (!exit_code)
			printf("%lu\n", ret_ulong);
		ret = ret_ulong;
		break;
	default:
		BUG("unknown <type> value");
		break;
	}

	return !ret;
}
