/*
 * SPDX-FileCopyrightText: 2023-2026 Sébastien Helleu <flashcode@flashtux.org>
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

#ifndef WEECHAT_HOOK_URL_H
#define WEECHAT_HOOK_URL_H

#include <pthread.h>

struct t_weechat_plugin;
struct t_infolist_item;
struct t_hashtable;

#define HOOK_URL(hook, var) (((struct t_hook_url *)hook->hook_data)->var)

typedef int (t_hook_callback_url)(const void *pointer, void *data,
                                  const char *url,
                                  struct t_hashtable *options,
                                  struct t_hashtable *output);

struct t_hook_url
{
    t_hook_callback_url *callback;     /* URL callback                      */
    char *url;                         /* URL                               */
    struct t_hashtable *options;       /* URL options (see doc)             */
    long timeout;                      /* timeout (ms) (0 = no timeout)     */
    int stop_transfer;                 /* 1 is used to stop transfer now    */
    pthread_t thread_id;               /* thread id                         */
    int thread_created;                /* thread created                    */
    int thread_running;                /* 1 if thread is running            */
    struct t_hook *hook_timer;         /* timer to check if thread has ended*/
    struct t_hashtable *output;        /* URL transfer output data          */
};

extern char *hook_url_get_description (struct t_hook *hook);
extern struct t_hook *hook_url (struct t_weechat_plugin *plugin,
                                const char *url,
                                struct t_hashtable *options,
                                int timeout,
                                t_hook_callback_url *callback,
                                const void *callback_pointer,
                                void *callback_data);
extern void hook_url_free_data (struct t_hook *hook);
extern struct t_hdata *hook_url_hdata_hook_url_cb (const void *pointer,
                                                   void *data,
                                                   const char *hdata_name);
extern int hook_url_add_to_infolist (struct t_infolist_item *item,
                                         struct t_hook *hook);
extern void hook_url_print_log (struct t_hook *hook);

#endif /* WEECHAT_HOOK_URL_H */
