#ifndef _RATE_CTR_H
#define _RATE_CTR_H

#include <stdint.h>

#include <osmocore/linuxlist.h>

#define RATE_CTR_INTV_NUM	4

enum rate_ctr_intv {
	RATE_CTR_INTV_SEC,
	RATE_CTR_INTV_MIN,
	RATE_CTR_INTV_HOUR,
	RATE_CTR_INTV_DAY,
};

/* for each of the intervals, we keep the following values */
struct rate_ctr_per_intv {
	uint64_t last;
	uint64_t rate;
};

/* for each actual value, we keep the following data */
struct rate_ctr {
	uint64_t current;
	struct rate_ctr_per_intv intv[RATE_CTR_INTV_NUM];
};

struct rate_ctr_desc {
	const char *name;
	const char *description;
};

/* Describe a counter group class */
struct rate_ctr_group_desc {
	/* The prefix / format string to be used for all counters */
	char *group_prefix_fmt;
	/* The human-readable description of the group */
	char *group_description;
	/* The number of counters in this group */
	unsigned int num_ctr;
	/* Pointer to array of counter names */
	struct rate_ctr_desc *ctr_desc;
};

/* One instance of a counter group class */
struct rate_ctr_group {
	/* Linked list of all counter groups in the system */
	struct llist_head list;
	/* Pointer to the counter group class */
	const struct rate_ctr_group_desc *desc;
	unsigned int idx;
	/* The name prefix generated from desc->group_prefix_fmt and index */
	char *name_prefix;
	/* Actual counter structures below */
	struct rate_ctr ctr[0];
};

/* Allocate a new group of counters according to description */
struct rate_ctr_group *rate_ctr_group_alloc(void *ctx,
					    const struct rate_ctr_group_desc *desc,
					    unsigned int idx);

/* Free the memory for the specified group of counters */
void rate_ctr_group_free(struct rate_ctr_group *grp);

/* Add a number to the counter */
void rate_ctr_add(struct rate_ctr *ctr, int inc);

/* Increment the counter by 1 */
static inline void rate_ctr_inc(struct rate_ctr *ctr)
{
	rate_ctr_add(ctr, 1);
}

/* Initialize the counter module */
int rate_ctr_init(void *tall_ctx);

struct vty;
void vty_out_rate_ctr_group(struct vty *vty, const char *prefix,
			    struct rate_ctr_group *ctrg);
#endif /* RATE_CTR_H */
