/*
** Copyright (C) 2001-2025 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/>.
**/

#include "zbxcommon.h"
#include "poller_proxy.h"
#include "zbxproxybuffer.h"

/******************************************************************************
 *                                                                            *
 * Purpose: processes program type (proxy) specific internal checks           *
 *                                                                            *
 * Parameters: item    - [IN] item to process                                 *
 *             param1  - [IN] first parameter                                 *
 *             request - [IN]                                                 *
 *             result  - [OUT]                                                *
 *                                                                            *
 * Return value: SUCCEED - data successfully retrieved and stored in result   *
 *               NOTSUPPORTED - requested item is not supported               *
 *               FAIL - not proxy specific internal check                     *
 *                                                                            *
 * Comments: This function is used to process proxy specific internal checks  *
 *           before generic internal checks are processed.                    *
 *                                                                            *
 ******************************************************************************/
int	zbx_get_value_internal_ext_proxy(const zbx_dc_item_t *item, const char *param1,
		const AGENT_REQUEST *request, AGENT_RESULT *result)
{
	ZBX_UNUSED(item);

	if (0 == strcmp(param1, "proxy_history"))
	{
		if (1 != get_rparams_num(request))
		{
			SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid number of parameters."));
			return NOTSUPPORTED;
		}

		SET_UI64_RESULT(result, zbx_pb_history_get_unsent_num());
		return SUCCEED;
	}

	if (0 == strcmp(param1, "proxy_buffer"))
	{
		const char	*param2, *param3;
		int		params_num;
		char		*error = NULL;

		params_num = get_rparams_num(request);

		if (params_num < 2 || params_num > 3)
		{
			SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid number of parameters."));
			return NOTSUPPORTED;
		}

		param2 = get_rparam(request, 1);
		param3 = get_rparam(request, 2);

		if (0 == strcmp(param2, "buffer"))
		{
			zbx_pb_mem_info_t	info;

			if (SUCCEED != zbx_pb_get_mem_info(&info, &error))
			{
				SET_MSG_RESULT(result, error);
				return NOTSUPPORTED;
			}

			if (NULL == param3 || '\0' == *param3 || 0 == strcmp(param3, "pfree"))
			{
				SET_DBL_RESULT(result, (double)(info.mem_total - info.mem_used) /
						(double)info.mem_total * 100);
			}
			else if (0 == strcmp(param3, "free"))
			{
				SET_UI64_RESULT(result, info.mem_total - info.mem_used);
			}
			else if (0 == strcmp(param3, "total"))
			{
				SET_UI64_RESULT(result, info.mem_total);
			}
			else if (0 == strcmp(param3, "used"))
			{
				SET_UI64_RESULT(result, info.mem_used);
			}
			else if (0 == strcmp(param3, "pused"))
			{
				SET_DBL_RESULT(result, (double)info.mem_used / (double)info.mem_total * 100);
			}
			else
			{
				SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter."));
				return NOTSUPPORTED;
			}
		}
		else if (0 == strcmp(param2, "state"))
		{
			zbx_pb_state_info_t	info;

			zbx_pb_get_state_info(&info);

			if (NULL == param3 || '\0' == *param3 || 0 == strcmp(param3, "current"))
			{
				SET_UI64_RESULT(result, (zbx_uint64_t)info.state);
			}
			else if (0 == strcmp(param3, "changes"))
			{
				SET_UI64_RESULT(result, (zbx_uint64_t)info.changes_num);
			}
			else
			{
				SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter."));
				return NOTSUPPORTED;
			}
		}
		else
		{
			SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter."));
			return SUCCEED;
		}

	}
	else
		return FAIL;

	return SUCCEED;
}