// === Início de: components/mqtt/include/mqtt.h ===
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdbool.h>
#include <stdint.h>
#include "esp_err.h"

// Tamanhos máximos esperados pelos getters (buffers do chamador)
#define MQTT_SERVER_MAX_LEN 64     ///< host ou URI do broker
#define MQTT_BASE_TOPIC_MAX_LEN 64 ///< tópico base (ex: "evse")
#define MQTT_USERNAME_MAX_LEN 32
#define MQTT_PASSWORD_MAX_LEN 64

    // =============================
    // Limit modes (cmd/evse/limit)
    // =============================
    typedef enum
    {
        LIMIT_MODE_OFF = 0,      ///< sem limite, usa max do hardware
        LIMIT_MODE_MANUAL,       ///< corrente fixa definida pelo utilizador
        LIMIT_MODE_LOADBALANCER, ///< limita pelo contador da instalação
        LIMIT_MODE_SOLAR         ///< só com excedente FV
    } limit_mode_t;

    /**
     * @brief Inicializa o módulo MQTT.
     *
     * - Carrega configuração da NVS
     * - Regista handlers de eventos (AUTH, SCHED, LOADBALANCER, METER, EVSE, NETWORK)
     * - Cria a task de telemetria periódica
     * - Aplica o modo de limite persistido
     *
     * Não inicia a ligação ao broker imediatamente; isso acontece quando existir IP
     * (NETWORK_EVENT_STA_GOT_IP) e `enabled == true`.
     *
     * IMPORTANTE: chamar DEPOIS de loadbalancer_init() para o restauro do modo
     * de limite funcionar correctamente.
     */
    esp_err_t mqtt_init(void);

    /**
     * @brief Força tentativa de ligação ao broker (normalmente não é necessário chamar).
     */
    esp_err_t mqtt_start(void);

    /**
     * @brief Pára o cliente MQTT e destrói o handle.
     */
    void mqtt_stop(void);

    // =============================
    // Getters de configuração
    // =============================

    bool mqtt_get_enabled(void);
    void mqtt_get_server(char *server);
    void mqtt_get_base_topic(char *base_topic);
    void mqtt_get_user(char *username);
    void mqtt_get_password(char *password);
    uint16_t mqtt_get_periodicity(void);

    // =============================
    // Setter de configuração
    // =============================

    /**
     * @brief Atualiza a configuração MQTT (tipicamente chamado pelo endpoint REST).
     *
     * - Grava em NVS
     * - Se já existir cliente ligado, pára e recria com a nova config
     * - Se `enabled == true` e houver IP, tenta ligar ao broker
     */
    esp_err_t mqtt_set_config(bool enabled,
                              const char *host,
                              const char *topic,
                              const char *username,
                              const char *password,
                              int periodicity);

#ifdef __cplusplus
}
#endif

// === Fim de: components/mqtt/include/mqtt.h ===