/*
** Copyright (C) 2001-2024 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_WEBDRIVER_H
#define ZABBIX_WEBDRIVER_H

#include "config.h"

#ifdef HAVE_LIBCURL

#include "browser_perf.h"
#include "zbxalgo.h"
#include "zbxembed.h"

typedef struct
{
	int	http_code;
	char	*error;
	char	*message;

}
zbx_wd_error_t;

typedef struct
{
	CURL			*handle;
	struct curl_slist	*headers;
	char			*data;
	char			*headers_in;
	size_t			data_alloc;
	size_t			data_offset;
	size_t			headers_in_alloc;
	size_t			headers_in_offset;

	char			*endpoint;
	char			*session;

	zbx_wd_perf_t		perf;
	int			refcount;

	double			create_time;

	char			*last_error_message;
	zbx_wd_error_t		*error;

	void			*browser;

	zbx_es_env_t		*env;
}
zbx_webdriver_t;

zbx_webdriver_t	*webdriver_create(const char *endpoint, const char *sourceip, char **error);
void	webdriver_destroy(zbx_webdriver_t *wd);
void	webdriver_release(zbx_webdriver_t *wd);
zbx_webdriver_t	*webdriver_addref(zbx_webdriver_t *wd);

int	webdriver_open_session(zbx_webdriver_t *wd, const char *capabilities, char **error);
int	webdriver_url(zbx_webdriver_t *wd, const char *url, char **error);
int	webdriver_get_url(zbx_webdriver_t *wd, char **url, char **error);

int	webdriver_find_element(zbx_webdriver_t *wd, const char *strategy, const char *selector, char **element,
		char **error);
int	webdriver_find_elements(zbx_webdriver_t *wd, const char *strategy, const char *selector,
		zbx_vector_str_t *elements, char **error);

int	webdriver_send_keys_to_element(zbx_webdriver_t *wd, const char *element, const char *keys, char **error);
int	webdriver_click_element(zbx_webdriver_t *wd, const char *element, char **error);
int	webdriver_clear_element(zbx_webdriver_t *wd, const char *element, char **error);
int	webdriver_get_element_info(zbx_webdriver_t *wd, const char *element, const char *info, const char *name,
		char **value, char **error);

int	webdriver_set_timeouts(zbx_webdriver_t *wd, int script_timeout, int page_load_timeout, int implicit_timeot,
		char **error);

int	webdriver_get_cookies(zbx_webdriver_t *wd, char **cookies, char **error);
int	webdriver_add_cookie(zbx_webdriver_t *wd, const char *cookie, char **error);

int	webdriver_get_screenshot(zbx_webdriver_t *wd, char **screenhost, char **error);
int	webdriver_set_screen_size(zbx_webdriver_t *wd, int width, int height, char **error);

void	webdriver_discard_error(zbx_webdriver_t *wd);

int	webdriver_get_page_source(zbx_webdriver_t *wd, char **source, char **error);

int	webdriver_has_error(zbx_webdriver_t *wd);
void	webdriver_set_error(zbx_webdriver_t *wd, char *message);

int	webdriver_get_alert(zbx_webdriver_t *wd, char **text, char **error);
int	webdriver_accept_alert(zbx_webdriver_t *wd, char **error);
int	webdriver_dismiss_alert(zbx_webdriver_t *wd, char **error);

int	webdriver_collect_perf_data(zbx_webdriver_t *wd, const char *bookmark, char **error);
int	webdriver_get_perf_data(zbx_webdriver_t *wd, struct zbx_json_parse *jp, char **error);
int	webdriver_get_raw_perf_data(zbx_webdriver_t *wd, const char *type, struct zbx_json_parse *jp, char **error);
int	webdriver_execute_script(zbx_webdriver_t *wd, const char *script, struct zbx_json_parse *jp,
		char **error);

int	webdriver_switch_frame(zbx_webdriver_t *wd, const char *frame, char **error);

#endif

#endif