#ifndef METER_EVENTS_H
#define METER_EVENTS_H

#include "esp_event.h"
#include "meter_manager.h" // meter_type_t
#include <stdint.h>        // int32_t, int64_t

#ifdef __cplusplus
extern "C"
{
#endif

    // Base de eventos dos medidores
    ESP_EVENT_DECLARE_BASE(METER_EVENT);

    // IDs de eventos emitidos por medidores
    typedef enum
    {
        METER_EVENT_DATA_READY = 0,
        METER_EVENT_ERROR,
        METER_EVENT_STARTED,
        METER_EVENT_STOPPED,
        METER_EVENT_CONFIG_UPDATED
    } meter_event_id_t;

    // Estrutura de dados enviados com METER_EVENT_DATA_READY
    // NOTA: campos não suportados pelo meter devem ficar a 0.
    typedef struct
    {
        const char *source; // "GRID" ou "EVSE"

        float vrms[3]; // V por fase (0 se não existir)
        float irms[3]; // A por fase (0 se não existir)

        int32_t watt[3];    // W por fase (0 se não existir)
        int32_t watt_total; // W total ASSINADO: +import / -export (0 se não existir)

        float frequency;    // Hz (0 se não existir)
        float power_factor; // (0 se não existir)
        float total_energy; // kWh (0 se não existir)

        int64_t timestamp_us; // esp_timer_get_time() (0 => consumidor pode usar "now")
    } meter_event_data_t;

    // Estrutura de dados enviados com METER_EVENT_CONFIG_UPDATED
    typedef struct
    {
        meter_type_t grid_type;
        meter_type_t evse_type;
        int64_t timestamp_us; // esp_timer_get_time()
    } meter_config_event_t;

#ifdef __cplusplus
}
#endif

#endif // METER_EVENTS_H
