/*
** 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/>.
**/

#ifndef ZABBIX_TEMPLATE_H
#define ZABBIX_TEMPLATE_H

#include "zbxdbhigh.h"
#include "zbxalgo.h"

typedef struct _zbx_template_item_preproc_t zbx_template_item_preproc_t;
ZBX_PTR_VECTOR_DECL(item_preproc_ptr, zbx_template_item_preproc_t *)

typedef struct _zbx_template_lld_macro_t zbx_template_lld_macro_t;
ZBX_PTR_VECTOR_DECL(lld_macro_ptr, zbx_template_lld_macro_t *)

typedef struct
{
	zbx_uint64_t			itemid;
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_RESET_FLAG		__UINT64_C(0x0000000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_INTERFACEID		__UINT64_C(0x0000000000001)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_TEMPLATEID		__UINT64_C(0x0000000000002)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_NAME			__UINT64_C(0x0000000000004)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_TYPE			__UINT64_C(0x0000000000008)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_VALUE_TYPE		__UINT64_C(0x0000000000010)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_DELAY			__UINT64_C(0x0000000000020)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_HISTORY			__UINT64_C(0x0000000000040)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_TRENDS			__UINT64_C(0x0000000000080)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_STATUS			__UINT64_C(0x0000000000100)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_TRAPPER_HOSTS		__UINT64_C(0x0000000000200)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_UNITS			__UINT64_C(0x0000000000400)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_FORMULA			__UINT64_C(0x0000000000800)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_LOGTIMEFMT		__UINT64_C(0x0000000001000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_VALUEMAPID		__UINT64_C(0x0000000002000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_PARAMS			__UINT64_C(0x0000000004000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_IPMI_SENSOR		__UINT64_C(0x0000000008000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_SNMP_OID			__UINT64_C(0x0000000010000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_AUTHTYPE			__UINT64_C(0x0000000020000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_USERNAME			__UINT64_C(0x0000000040000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_PASSWORD			__UINT64_C(0x0000000080000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_PUBLICKEY			__UINT64_C(0x0000000100000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_PRIVATEKEY		__UINT64_C(0x0000000200000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_FLAGS			__UINT64_C(0x0000000400000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_DESCRIPTION		__UINT64_C(0x0000000800000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_INVENTORY_LINK		__UINT64_C(0x0000001000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_LIFETIME			__UINT64_C(0x0000002000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_EVALTYPE			__UINT64_C(0x0000004000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_JMX_ENDPOINT		__UINT64_C(0x0000008000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_MASTER_ITEMID		__UINT64_C(0x0000010000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_TIMEOUT			__UINT64_C(0x0000020000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_URL			__UINT64_C(0x0000040000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_QUERY_FIELDS		__UINT64_C(0x0000080000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_POSTS			__UINT64_C(0x0000100000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_STATUS_CODES		__UINT64_C(0x0000200000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_FOLLOW_REDIRECTS		__UINT64_C(0x0000400000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_POST_TYPE			__UINT64_C(0x0000800000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_HTTP_PROXY		__UINT64_C(0x0001000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_HEADERS			__UINT64_C(0x0002000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_RETRIEVE_MODE		__UINT64_C(0x0004000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_REQUEST_METHOD		__UINT64_C(0x0008000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_OUTPUT_FORMAT		__UINT64_C(0x0010000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_SSL_CERT_FILE		__UINT64_C(0x0020000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_SSL_KEY_FILE		__UINT64_C(0x0040000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_SSL_KEY_PASSWORD		__UINT64_C(0x0080000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_VERIFY_PEER		__UINT64_C(0x0100000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_VERIFY_HOST		__UINT64_C(0x0200000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_ALLOW_TRAPS		__UINT64_C(0x0400000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_DISCOVER			__UINT64_C(0x0800000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_LIFETIME_TYPE		__UINT64_C(0x1000000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_ENABLED_LIFETIME		__UINT64_C(0x2000000000000)
#define ZBX_FLAG_TEMPLATE_ITEM_UPDATE_ENABLED_LIFETIME_TYPE	__UINT64_C(0x4000000000000)

	zbx_uint64_t			upd_flags;
	zbx_uint64_t			valuemapid_orig;
	zbx_uint64_t			valuemapid;
	zbx_uint64_t			interfaceid_orig;
	zbx_uint64_t			interfaceid;
	zbx_uint64_t			templateid_orig;
	zbx_uint64_t			templateid;
	zbx_uint64_t			master_itemid_orig;
	zbx_uint64_t			master_itemid;
	char				*name_orig;
	char				*name;
	char				*key;
	char				*delay_orig;
	char				*delay;
	char				*history_orig;
	char				*history;
	char				*trends_orig;
	char				*trends;
	char				*trapper_hosts_orig;
	char				*trapper_hosts;
	char				*units_orig;
	char				*units;
	char				*formula_orig;
	char				*formula;
	char				*logtimefmt_orig;
	char				*logtimefmt;
	char				*params_orig;
	char				*params;
	char				*ipmi_sensor_orig;
	char				*ipmi_sensor;
	char				*snmp_oid_orig;
	char				*snmp_oid;
	char				*username_orig;
	char				*username;
	char				*password_orig;
	char				*password;
	char				*publickey_orig;
	char				*publickey;
	char				*privatekey_orig;
	char				*privatekey;
	char				*description_orig;
	char				*description;
	char				*lifetime_orig;
	char				*lifetime;
	char				*enabled_lifetime_orig;
	char				*enabled_lifetime;
	char				*jmx_endpoint_orig;
	char				*jmx_endpoint;
	char				*timeout_orig;
	char				*timeout;
	char				*url_orig;
	char				*url;
	char				*query_fields_orig;
	char				*query_fields;
	char				*posts_orig;
	char				*posts;
	char				*status_codes_orig;
	char				*status_codes;
	char				*http_proxy_orig;
	char				*http_proxy;
	char				*headers_orig;
	char				*headers;
	char				*ssl_cert_file_orig;
	char				*ssl_cert_file;
	char				*ssl_key_file_orig;
	char				*ssl_key_file;
	char				*ssl_key_password_orig;
	char				*ssl_key_password;
	unsigned char			verify_peer_orig;
	unsigned char			verify_peer;
	unsigned char			verify_host_orig;
	unsigned char			verify_host;
	unsigned char			follow_redirects_orig;
	unsigned char			follow_redirects;
	unsigned char			post_type_orig;
	unsigned char			post_type;
	unsigned char			retrieve_mode_orig;
	unsigned char			retrieve_mode;
	unsigned char			request_method_orig;
	unsigned char			request_method;
	unsigned char			output_format_orig;
	unsigned char			output_format;
	unsigned char			type_orig;
	unsigned char			type;
	unsigned char			value_type_orig;
	unsigned char			value_type;
	unsigned char			status_orig;
	unsigned char			status;
	unsigned char			authtype_orig;
	unsigned char			authtype;
	unsigned char			flags_orig;
	unsigned char			flags;
	unsigned char			inventory_link_orig;
	unsigned char			inventory_link;
	unsigned char			evaltype_orig;
	unsigned char			evaltype;
	unsigned char			allow_traps_orig;
	unsigned char			allow_traps;
	unsigned char			discover_orig;
	unsigned char			discover;
	unsigned char			lifetime_type_orig;
	unsigned char			lifetime_type;
	unsigned char			enabled_lifetime_type_orig;
	unsigned char			enabled_lifetime_type;
	zbx_vector_ptr_t		dependent_items;
	zbx_vector_item_preproc_ptr_t	item_preprocs;
	zbx_vector_item_preproc_ptr_t	template_preprocs;
	zbx_vector_db_tag_ptr_t		item_tags;
	zbx_vector_db_tag_ptr_t		template_tags;
	zbx_vector_item_param_ptr_t	item_params;
	zbx_vector_item_param_ptr_t	template_params;
	zbx_vector_lld_macro_ptr_t	item_lld_macros;
	zbx_vector_lld_macro_ptr_t	template_lld_macros;
}
zbx_template_item_t;

void	DBcopy_template_items(zbx_uint64_t hostid, const zbx_vector_uint64_t *templateids, int audit_context_mode);
void	zbx_audit_item_update_json_add_data(int audit_context_mode, zbx_uint64_t itemid,
		const zbx_template_item_t *item, zbx_uint64_t hostid);
#endif