#pragma once

/* Global MCGP general rate counters */
enum {
	MGCP_GENERAL_RX_MSGS_TOTAL,
	MGCP_GENERAL_RX_MSGS_RETRANSMITTED,
	MGCP_GENERAL_RX_MSGS_HANDLED,
	MGCP_GENERAL_RX_MSGS_UNHANDLED,
	MGCP_GENERAL_RX_FAIL_MSG_PARSE,
	MGCP_GENERAL_RX_FAIL_NO_ENDPOINT,
};

/* Trunk-global MCGP CRCX related rate counters */
enum {
	MGCP_CRCX_SUCCESS,
	MGCP_CRCX_FAIL_BAD_ACTION,
	MGCP_CRCX_FAIL_UNHANDLED_PARAM,
	MGCP_CRCX_FAIL_MISSING_CALLID,
	MGCP_CRCX_FAIL_INVALID_MODE,
	MGCP_CRCX_FAIL_LIMIT_EXCEEDED,
	MGCP_CRCX_FAIL_UNKNOWN_CALLID,
	MGCP_CRCX_FAIL_ALLOC_CONN,
	MGCP_CRCX_FAIL_NO_REMOTE_CONN_DESC,
	MGCP_CRCX_FAIL_START_RTP,
	MGCP_CRCX_FAIL_NO_OSMUX,
	MGCP_CRCX_FAIL_INVALID_CONN_OPTIONS,
	MGCP_CRCX_FAIL_CODEC_NEGOTIATION,
	MGCP_CRCX_FAIL_BIND_PORT,
	MGCP_CRCX_FAIL_AVAIL,
	MGCP_CRCX_FAIL_CLAIM,
};

/* Trunk-global MCGP MDCX related rate counters */
enum {
	MGCP_MDCX_SUCCESS,
	MGCP_MDCX_FAIL_WILDCARD,
	MGCP_MDCX_FAIL_NO_CONN,
	MGCP_MDCX_FAIL_INVALID_CALLID,
	MGCP_MDCX_FAIL_INVALID_CONNID,
	MGCP_MDCX_FAIL_UNHANDLED_PARAM,
	MGCP_MDCX_FAIL_NO_CONNID,
	MGCP_MDCX_FAIL_CONN_NOT_FOUND,
	MGCP_MDCX_FAIL_INVALID_MODE,
	MGCP_MDCX_FAIL_INVALID_CONN_OPTIONS,
	MGCP_MDCX_FAIL_NO_REMOTE_CONN_DESC,
	MGCP_MDCX_FAIL_START_RTP,
	MGCP_MDCX_FAIL_AVAIL,
};

/* Trunk-global MCGP DLCX related rate counters */
enum {
	MGCP_DLCX_SUCCESS,
	MGCP_DLCX_FAIL_NO_CONN,
	MGCP_DLCX_FAIL_INVALID_CALLID,
	MGCP_DLCX_FAIL_INVALID_CONNID,
	MGCP_DLCX_FAIL_UNHANDLED_PARAM,
	MGCP_DLCX_FAIL_AVAIL,
};

/* Trunk-global E1 related counters */
enum {
        E1_I460_TRAU_RX_FAIL_CTR,
        E1_I460_TRAU_TX_FAIL_CTR,
        E1_I460_TRAU_MUX_EMPTY_CTR,
};

/* NOTE: When adding counters, also the dump_ratectr_* routines in vty.c must be updated. */

struct mgcp_ratectr_global {
	/* Rate counter group which contains stats for generic MGCP events. */
	struct rate_ctr_group *mgcp_general_ctr_group;
};

struct mgcp_ratectr_trunk {
	/* Rate counter group which contains stats for processed CRCX commands. */
	struct rate_ctr_group *mgcp_crcx_ctr_group;
	/* Rate counter group which contains stats for processed MDCX commands. */
	struct rate_ctr_group *mgcp_mdcx_ctr_group;
	/* Rate counter group which contains stats for processed DLCX commands. */
	struct rate_ctr_group *mgcp_dlcx_ctr_group;
	/* Rate counter group which aggregates stats of individual RTP connections. */
	struct rate_ctr_group *all_rtp_conn_stats;
	/* Rate counter group which aggregates stats of individual Osmux connections. */
	struct rate_ctr_group *all_osmux_conn_stats;
	/* Rate counter group which contains stats for E1 events (only valid for E1 trunks) */
	struct rate_ctr_group *e1_stats;
};

struct mgcp_config;
struct mgcp_trunk;

int mgcp_ratectr_global_alloc(struct mgcp_config *cfg);
void mgcp_ratectr_global_free(struct mgcp_config *cfg);
int mgcp_ratectr_trunk_alloc(struct mgcp_trunk *trunk);
void mgcp_ratectr_trunk_free(struct mgcp_trunk *trunk);

/* Trunk-global common stat items */
enum {
	TRUNK_STAT_ENDPOINTS_TOTAL,
	TRUNK_STAT_ENDPOINTS_USED,
};

struct mgcp_stat_trunk {
	/* Stat item group which contains general status values of the trunk. */
	struct osmo_stat_item_group *common;
};

int mgcp_stat_trunk_alloc(struct mgcp_trunk *trunk);
void mgcp_stat_trunk_free(struct mgcp_trunk *trunk);
