#include <stdio.h>
#include <inttypes.h>
#include "optgroup.h"
#include "compiler/compiler.h"

/*
 * Option grouping
 */
static const struct opt_group fio_opt_groups[] = {
	{
		.name	= "General",
		.mask	= FIO_OPT_C_GENERAL,
	},
	{
		.name	= "I/O",
		.mask	= FIO_OPT_C_IO,
	},
	{
		.name	= "File",
		.mask	= FIO_OPT_C_FILE,
	},
	{
		.name	= "Statistics",
		.mask	= FIO_OPT_C_STAT,
	},
	{
		.name	= "Logging",
		.mask	= FIO_OPT_C_LOG,
	},
	{
		.name	= "Profiles",
		.mask	= FIO_OPT_C_PROFILE,
	},
	{
		.name	= "I/O engines",
		.mask	= FIO_OPT_C_ENGINE,
	},
	{
		.name	= NULL,
	},
};

static const struct opt_group fio_opt_cat_groups[] = {
	{
		.name	= "Rate",
		.mask	= FIO_OPT_G_RATE,
	},
	{
		.name	= "Zone",
		.mask	= FIO_OPT_G_ZONE,
	},
	{
		.name	= "Read/write mix",
		.mask	= FIO_OPT_G_RWMIX,
	},
	{
		.name	= "Verify",
		.mask	= FIO_OPT_G_VERIFY,
	},
	{
		.name	= "Trim",
		.mask	= FIO_OPT_G_TRIM,
	},
	{
		.name	= "I/O Logging",
		.mask	= FIO_OPT_G_IOLOG,
	},
	{
		.name	= "I/O Depth",
		.mask	= FIO_OPT_G_IO_DEPTH,
	},
	{
		.name	= "I/O Flow",
		.mask	= FIO_OPT_G_IO_FLOW,
	},
	{
		.name	= "Description",
		.mask	= FIO_OPT_G_DESC,
	},
	{
		.name	= "Filename",
		.mask	= FIO_OPT_G_FILENAME,
	},
	{
		.name	= "General I/O",
		.mask	= FIO_OPT_G_IO_BASIC,
	},
	{
		.name	= "Cgroups",
		.mask	= FIO_OPT_G_CGROUP,
	},
	{
		.name	= "Runtime",
		.mask	= FIO_OPT_G_RUNTIME,
	},
	{
		.name	= "Process",
		.mask	= FIO_OPT_G_PROCESS,
	},
	{
		.name	= "Job credentials / priority",
		.mask	= FIO_OPT_G_CRED,
	},
	{
		.name	= "Clock settings",
		.mask	= FIO_OPT_G_CLOCK,
	},
	{
		.name	= "I/O Type",
		.mask	= FIO_OPT_G_IO_TYPE,
	},
	{
		.name	= "I/O Thinktime",
		.mask	= FIO_OPT_G_THINKTIME,
	},
	{
		.name	= "Randomizations",
		.mask	= FIO_OPT_G_RANDOM,
	},
	{
		.name	= "I/O buffers",
		.mask	= FIO_OPT_G_IO_BUF,
	},
	{
		.name	= "Tiobench profile",
		.mask	= FIO_OPT_G_TIOBENCH,
	},
	{
		.name	= "Error handling",
		.mask	= FIO_OPT_G_ERR,
	},
	{
		.name	= "Ext4 defrag I/O engine", /* e4defrag */
		.mask	= FIO_OPT_G_E4DEFRAG,
	},
	{
		.name	= "Network I/O engine", /* net */
		.mask	= FIO_OPT_G_NETIO,
	},
	{
		.name	= "RDMA I/O engine", /* rdma */
		.mask	= FIO_OPT_G_RDMA,
	},
	{
		.name	= "libaio I/O engine", /* libaio */
		.mask	= FIO_OPT_G_LIBAIO,
	},
	{
		.name	= "ACT Aerospike like benchmark profile",
		.mask	= FIO_OPT_G_ACT,
	},
	{
		.name	= "Latency profiling",
		.mask	= FIO_OPT_G_LATPROF,
	},
	{
		.name	= "RBD I/O engine", /* rbd */
		.mask	= FIO_OPT_G_RBD,
	},
	{
		.name	= "GlusterFS I/O engine", /* gfapi,gfapi_async */
		.mask	= FIO_OPT_G_GFAPI,
	},
	{
		.name	= "MTD I/O engine", /* mtd */
		.mask	= FIO_OPT_G_MTD,
	},
	{
		.name	= "libhdfs I/O engine", /* libhdfs */
		.mask	= FIO_OPT_G_HDFS,
	},
	{
		.name	= NULL,
	},
};

static const struct opt_group *group_from_mask(const struct opt_group *ogs,
					       uint64_t *mask,
					       uint64_t inv_mask)
{
	int i;

	if (*mask == inv_mask || !*mask)
		return NULL;

	for (i = 0; ogs[i].name; i++) {
		const struct opt_group *og = &ogs[i];

		if (*mask & og->mask) {
			*mask &= ~(og->mask);
			return og;
		}
	}

	return NULL;
}

const struct opt_group *opt_group_from_mask(uint64_t *mask)
{
	return group_from_mask(fio_opt_groups, mask, FIO_OPT_C_INVALID);
}

const struct opt_group *opt_group_cat_from_mask(uint64_t *mask)
{
	compiletime_assert(__FIO_OPT_G_NR <= 8 * sizeof(uint64_t),
				"__FIO_OPT_G_NR");

	return group_from_mask(fio_opt_cat_groups, mask, FIO_OPT_G_INVALID);
}
