/*
 * Copyright (c) 1995-2001 Silicon Graphics, Inc.  All Rights Reserved.
 * Copyright (c) 2009 Aconex.  All Rights Reserved.
 */

#include <pcp/pmapi.h>
#include <pcp/mmv_stats.h>

static mmv_instances_t test_instances [] = {
    {  0, "zero" },
    {  1, "hero" },
};

static mmv_instances_t nest_instances [] = {
    {  0, "bird" },
    {  1, "tree" },
    {  2, "eggs" },
};

static mmv_indom_t indoms[] = {
    {	.serial = 1,
	.count = 2,
	.instances = test_instances,
	.shorttext = "We can be heroes",
	.helptext = "We can be heroes, just for one day",
    },
    {	.serial = 2,
	.count = 3,
	.instances = nest_instances,
	/* exercise no-help-text case */
    },
};

static mmv_metric_t metrics[] = {
    {	.name = "counter",
	.item = 1,
	.type = MMV_TYPE_U32,
	.semantics = MMV_SEM_COUNTER,
	.dimension = MMV_UNITS(0,0,1,0,0,PM_COUNT_ONE),
	.shorttext = "test counter metric",
	.helptext = "Yes, this is a test counter metric",
    },
    {	.name = "discrete",
	.item = 2,
	.type = MMV_TYPE_I32,
	.semantics = MMV_SEM_DISCRETE,
	.dimension = MMV_UNITS(0,0,0,0,0,0),
	.shorttext = "test discrete metric",
	.helptext = "Yes, this is a test discrete metric",
    },
    {	.name = "indom",
	.item = 3,
	.type = MMV_TYPE_U32,	
	.semantics = MMV_SEM_INSTANT,
	.dimension = MMV_UNITS(0,0,1,0,0,PM_COUNT_ONE),
	.indom = 1,
	/* exercise no-help-text, no indom case */
    },
    {	.name = "interval",
	.item = 4,
	.type = MMV_TYPE_ELAPSED,
	.semantics = MMV_SEM_COUNTER,
	.dimension = MMV_UNITS(0,1,0,0,PM_TIME_USEC,0),
	.indom = 2,
	/* exercise no-help-text case */
    },
    {	.name = "string",
	.item = 5,
	.type = MMV_TYPE_STRING,
	.dimension = MMV_UNITS(0,0,0,0,0,0),
	.semantics = MMV_SEM_INSTANT,
	/* exercise no-help-text, string value case */
    },
    {	.name = "strings",
	.item = 6,
	.type = MMV_TYPE_STRING,
	.semantics = MMV_SEM_INSTANT,
	.dimension = MMV_UNITS(0,0,0,0,0,0),
	.indom = 1,
	.shorttext = "test string metrics",
	.helptext = "Yes, this is a test string metric with instances",
    },
};

static inline int indom_count() { return sizeof(indoms)/sizeof(indoms[0]); }
static inline int metric_count() { return sizeof(metrics)/sizeof(metrics[0]); }

int 
main(int ac, char * av[])
{
    pmAtomValue * atom;
    char * file = (ac > 1) ? av[1] : "test";
    int sleeper = (ac > 2) ? atoi(av[2]) : 0;
    void * addr = mmv_stats_init(file, 0, 0,
			metrics, metric_count(), indoms, indom_count());

    if (!addr) {
	fprintf(stderr, "mmv_stats_init failed : %s\n", strerror(errno));
	return 1;
    }

    /* start an interval */
    atom = mmv_stats_interval_start(addr, NULL, "interval", "eggs");

    /* add ... */
    mmv_stats_add(addr, "counter", "", 40);
    /* add 1 ... */
    mmv_stats_inc(addr, "counter", "");

    /* set string values */
    mmv_stats_set_string(addr, "string", "", "g'day world");
    mmv_stats_set_strlen(addr, "strings", "zero", "00oo00oo00", 10);
    mmv_stats_set_strlen(addr, "strings", "zero", "00oo00oo00", 6);
    mmv_stats_set_strlen(addr, "strings", "hero", "ZERO", 4);
    mmv_stats_set_strlen(addr, "strings", "hero", "", 0);

    /* set discrete value ... */
    mmv_stats_set(addr, "discrete", "", 41);
    mmv_stats_inc(addr, "discrete", "");

    /* add to instance or another if first doesn't exist */
    mmv_stats_add_fallback(addr, "indom", "foobar", "unknown", 42);
    mmv_stats_add_fallback(addr, "indom", "zero", "unknown", 43);

    sleep(sleeper);

    /* end an interval */
    mmv_stats_interval_end(addr, atom);

    return 0;
}
