#ifndef LED_H_
#define LED_H_

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

/**
 * @brief Identificadores dos LEDs disponíveis no hardware (por cor)
 */
typedef enum
{
    LED_ID_GREEN = 0,
    LED_ID_BLUE,
    LED_ID_RED,
    LED_ID_MAX
} led_id_t;

/**
 * @brief Padrões de comportamento possíveis para os LEDs.
 *
 * Estes padrões são usados tanto pela lógica interna (estado EVSE, efeitos
 * de sessão, etc.) como por código externo que queira forçar um determinado
 * comportamento num LED.
 *
 * Nota:
 *  - LED_PATTERN_BREATHING é implementado por uma task interna (HSV).
 *  - LED_PATTERN_CHARGING_EFFECT é legado/experimental e pode não ser usado
 *    diretamente na implementação atual.
 */
typedef enum
{
    LED_PATTERN_OFF,             ///< LED sempre desligado
    LED_PATTERN_ON,              ///< LED sempre ligado
    LED_PATTERN_BLINK,           ///< Pisca com ciclo padrão (500ms on / 500ms off)
    LED_PATTERN_BLINK_FAST,      ///< Pisca rápido (250ms on / 250ms off)
    LED_PATTERN_BLINK_SLOW,      ///< Pisca lento (500ms on / 1500ms off)
    LED_PATTERN_CHARGING_EFFECT, ///< Efeito de carregamento (2s on / 1s off) - legado/opcional
    LED_PATTERN_BREATHING        ///< Efeito "breathing" (brilho suave via HSV)
} led_pattern_t;

/**
 * @brief Inicializa o subsistema de LEDs com base na configuração da placa.
 *
 * - Configura o driver LEDC com os GPIOs definidos em board_config.
 * - Cria a task de efeitos (para padrões como BREATHING).
 * - Regista handlers dos eventos EVSE (estado e sessão) para aplicar
 *   padrões automáticos em função do estado do carregador.
 *
 * Deve ser chamada uma única vez na inicialização do sistema.
 */
void led_init(void);

/**
 * @brief Define diretamente o tempo ligado/desligado de um LED.
 *
 * Esta função permite criar padrões personalizados à parte da tabela
 * led_pattern_t. Normalmente, código de alto nível deve preferir
 * led_apply_pattern(), deixando a lógica de tempos a cargo do módulo.
 *
 * @param led_id   Identificador do LED (ver led_id_t)
 * @param ontime   Tempo ligado em milissegundos (0 = sempre off)
 * @param offtime  Tempo desligado em milissegundos (0 = sempre on)
 */
void led_set_state(led_id_t led_id, uint16_t ontime, uint16_t offtime);

/**
 * @brief Aplica um padrão de piscar/efeito definido ao LED.
 *
 * Esta é a API recomendada para controlar LEDs externamente. A implementação
 * interna do módulo também a usa para reagir a eventos EVSE (estado de
 * carregamento, início/fim de sessão, etc.).
 *
 * @param led_id   Identificador do LED (ver led_id_t)
 * @param pattern  Padrão desejado (ver led_pattern_t)
 */
void led_apply_pattern(led_id_t led_id, led_pattern_t pattern);

#endif /* LED_H_ */
