#pragma once

/*! \defgroup rate_ctr Rate counters
 *  @{
 * \file rate_ctr.h */

#include <stdint.h>

#include <osmocom/core/linuxlist.h>

/*! Number of rate counter intervals */
#define RATE_CTR_INTV_NUM	4

/*! Rate counter interval */
enum rate_ctr_intv {
	RATE_CTR_INTV_SEC,	/*!< last second */
	RATE_CTR_INTV_MIN,	/*!< last minute */
	RATE_CTR_INTV_HOUR,	/*!< last hour */
	RATE_CTR_INTV_DAY,	/*!< last day */
};

/*! data we keep for each of the intervals */
struct rate_ctr_per_intv {
	uint64_t last;		/*!< counter value in last interval */
	uint64_t rate;		/*!< counter rate */
};

/*! data we keep for each actual value */
struct rate_ctr {
	uint64_t current;	/*!< current value */
	uint64_t previous;	/*!< previous value, used for delta */
	/*! per-interval data */
	struct rate_ctr_per_intv intv[RATE_CTR_INTV_NUM];
};

/*! rate counter description */
struct rate_ctr_desc {
	const char *name;	/*!< name of the counter */
	const char *description;/*!< description of the counter */
};

/*! description of a rate counter group */
struct rate_ctr_group_desc {
	/*! The prefix to the name of all counters in this group */
	const char *group_name_prefix;
	/*! The human-readable description of the group */
	const char *group_description;
	/*! The class to which this group belongs */
	int class_id;
	/*! The number of counters in this group */
	unsigned int num_ctr;
	/*! Pointer to array of counter names */
	const 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;
	/*! The index of this ctr_group within its class */
	unsigned int idx;
	/*! Actual counter structures below */
	struct rate_ctr ctr[0];
};

struct rate_ctr_group *rate_ctr_group_alloc(void *ctx,
					    const struct rate_ctr_group_desc *desc,
					    unsigned int idx);

static inline void rate_ctr_group_upd_idx(struct rate_ctr_group *grp, unsigned int idx)
{
	grp->idx = idx;
}

void rate_ctr_group_free(struct rate_ctr_group *grp);

/*! Increment the counter by \a inc
 *  \param ctr \ref rate_ctr to increment
 *  \param inc quantity to increment \a ctr by */
void rate_ctr_add(struct rate_ctr *ctr, int inc);

/*! Increment the counter by 1
 *  \param ctr \ref rate_ctr to increment */
static inline void rate_ctr_inc(struct rate_ctr *ctr)
{
	rate_ctr_add(ctr, 1);
}

/*! Increment the counter by 1
 *  \param ctrg \ref rate_ctr_group of counter
 *  \param idx index into \a ctrg counter group */
static inline void rate_ctr_inc2(struct rate_ctr_group *ctrg, unsigned int idx)
{
	rate_ctr_inc(&ctrg->ctr[idx]);
}


/*! Return the counter difference since the last call to this function */
int64_t rate_ctr_difference(struct rate_ctr *ctr);

int rate_ctr_init(void *tall_ctx);

struct rate_ctr_group *rate_ctr_get_group_by_name_idx(const char *name, const unsigned int idx);
const struct rate_ctr *rate_ctr_get_by_name(const struct rate_ctr_group *ctrg, const char *name);

typedef int (*rate_ctr_handler_t)(
	struct rate_ctr_group *, struct rate_ctr *,
	const struct rate_ctr_desc *, void *);
typedef int (*rate_ctr_group_handler_t)(struct rate_ctr_group *, void *);


/*! Iterate over all counters
 *  \param[in] handle_item Call-back function, aborts if rc < 0
 *  \param[in] data Private data handed through to \a handle_counter
 */
int rate_ctr_for_each_counter(struct rate_ctr_group *ctrg,
	rate_ctr_handler_t handle_counter, void *data);

int rate_ctr_for_each_group(rate_ctr_group_handler_t handle_group, void *data);

/*! @} */
