/*
** Copyright (C) 2001-2026 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/

#ifndef ZABBIX_LLD_PROTOCOL_H
#define ZABBIX_LLD_PROTOCOL_H

#include "zbxalgo.h"
#include "lld_manager.h"
#include "zbxtime.h"

#define ZBX_IPC_SERVICE_LLD	"lld"

/* poller -> manager */
#define ZBX_IPC_LLD_REGISTER		1000
#define ZBX_IPC_LLD_NEXT		1001
#define ZBX_IPC_LLD_DONE		1002

/* manager -> poller */
#define ZBX_IPC_LLD_PREPARE_VALUE	1100
#define ZBX_IPC_LLD_CHECK_VALUE		1101
#define ZBX_IPC_LLD_PROCESS		1102

/* process -> manager */
#define ZBX_IPC_LLD_REQUEST		1200

/* process -> poller */
#define ZBX_IPC_LLD_QUEUE		1300

/* process -> manager */
#define ZBX_IPC_LLD_DIAG_STATS		1400

/* manager -> process */
#define ZBX_IPC_LLD_DIAG_STATS_RESULT	1401

/* process -> manager */
#define ZBX_IPC_LLD_TOP_ITEMS		1402

/* manager -> process */
#define ZBX_IPC_LLD_TOP_ITEMS_RESULT	1403

zbx_uint32_t	zbx_lld_serialize_item_value(unsigned char **data, zbx_uint64_t itemid, zbx_uint64_t hostid,
		const char *value, const zbx_timespec_t *ts, unsigned char meta, zbx_uint64_t lastlogsize, int mtime,
		const char *error);

void	zbx_lld_deserialize_item_value(const unsigned char *data, zbx_uint64_t *itemid, zbx_uint64_t *hostid,
		char **value, zbx_timespec_t *ts, unsigned char *meta, zbx_uint64_t *lastlogsize, int *mtime,
		char **error);

zbx_uint32_t	zbx_lld_serialize_value(unsigned char **data, const char *value);

void	zbx_lld_deserialize_value(const unsigned char *data, char **value);

zbx_uint32_t	zbx_lld_serialize_diag_stats(unsigned char **data, zbx_uint64_t items_num, zbx_uint64_t values_num);

void	zbx_lld_deserialize_top_items_request(const unsigned char *data, int *limit);

zbx_uint32_t	zbx_lld_serialize_top_items_result(unsigned char **data, const zbx_lld_rule_info_t **rule_infos,
		int num);

void	zbx_lld_queue_value(zbx_uint64_t itemid, zbx_uint64_t hostid, const char *value, const zbx_timespec_t *ts,
		unsigned char meta, zbx_uint64_t lastlogsize, int mtime, const char *error);

void	zbx_lld_process_agent_result(zbx_uint64_t itemid, zbx_uint64_t hostid, AGENT_RESULT *result,
		zbx_timespec_t *ts, char *error);

int	zbx_lld_get_queue_size(zbx_uint64_t *size, char **error);

int	zbx_lld_get_diag_stats(zbx_uint64_t *items_num, zbx_uint64_t *values_num, char **error);

int	zbx_lld_get_top_items(int limit, zbx_vector_uint64_pair_t *items, char **error);

#endif
