#ifndef EVSE_STATE_H
#define EVSE_STATE_H

#include <stdbool.h>
#include "freertos/FreeRTOS.h"
#include "evse_events.h"

#ifdef __cplusplus
extern "C"
{
#endif

    typedef enum
    {
        EVSE_STATE_A,  // EV Not Connected (12V)
        EVSE_STATE_B1, // EV Connected (9V, Not Authorized)
        EVSE_STATE_B2, // EV Connected (9V, Authorized and Ready)
        EVSE_STATE_C1, // Charging Requested (6V, Relay Off)
        EVSE_STATE_C2, // Charging Active (6V, Relay On)
        EVSE_STATE_D1, // Ventilation Required (3V, Relay Off)
        EVSE_STATE_D2, // Ventilation Active (3V, Relay On)
        EVSE_STATE_E,  // Error: Pilot Short to Ground (0V)
        EVSE_STATE_F   // Fault: No Pilot or EVSE Unavailable
    } evse_state_t;

    // Initialization
    void evse_state_init(void);
    void evse_state_tick(void);

    // State Access & Control
    evse_state_t evse_get_state(void);
    void evse_set_state(evse_state_t state);
    const char *evse_state_to_str(evse_state_t state);

    // ---------------------------
    // State Evaluation Helpers
    // ---------------------------

    /**
     * @brief True se existe uma sessão "lógica" ativa (carro ligado e autorizado/pronto ou a carregar).
     * Inclui B2, C1/C2, D1/D2.
     */
    bool evse_state_is_session(evse_state_t state);

    /**
     * @brief True se o EVSE está a fornecer energia (relé ON).
     * Estados com energia: C2 e D2.
     *
     * Nota: isto substitui a antiga interpretação “C1/C2”.
     */
    bool evse_state_is_charging(evse_state_t state);

    /**
     * @brief True se o EV pediu carga mas o relé ainda está OFF (C1/D1).
     */
    bool evse_state_is_requesting(evse_state_t state);

    /**
     * @brief True se há fluxo de energia (alias explícito para charging).
     */
    bool evse_state_is_power_flowing(evse_state_t state);

    /**
     * @brief True se o EV está fisicamente ligado (B1 e além).
     */
    bool evse_state_is_plugged(evse_state_t state);

    // Authorization Control
    void evse_state_set_authorized(bool authorized);
    bool evse_state_get_authorized(void);

#ifdef __cplusplus
}
#endif

#endif // EVSE_STATE_H
