#ifndef EVSE_STATE_H
#define EVSE_STATE_H

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

#ifdef __cplusplus
extern "C" {
#endif

// ============================
// EVSE Pilot Signal States
// ============================

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
// ============================

/**
 * @brief Initializes the EVSE state machine and default state.
 */
void evse_state_init(void);

/**
 * @brief Periodic tick for state handling (optional hook).
 */
void evse_state_tick(void);

// ============================
// State Access & Control
// ============================

/**
 * @brief Returns the current EVSE state.
 */
evse_state_t evse_get_state(void);

/**
 * @brief Sets the current EVSE state and emits a change event if needed.
 */
void evse_set_state(evse_state_t state);

/**
 * @brief Converts the state enum into a human-readable string.
 */
const char* evse_state_to_str(evse_state_t state);

// ============================
// State Evaluation Helpers
// ============================

/**
 * @brief True if EV is in an active session (B2, C1, C2).
 */
bool evse_state_is_session(evse_state_t state);

/**
 * @brief True if EV is actively charging (C1, C2).
 */
bool evse_state_is_charging(evse_state_t state);

/**
 * @brief True if EV is physically plugged in (B1 and beyond).
 */
bool evse_state_is_plugged(evse_state_t state);

// ============================
// Authorization Control
// ============================

/**
 * @brief Sets whether the EV is authorized to charge.
 */
void evse_state_set_authorized(bool authorized);

/**
 * @brief Gets whether the EV is currently authorized.
 */
bool evse_state_get_authorized(void);

#ifdef __cplusplus
}
#endif

#endif // EVSE_STATE_H
