// components/loadbalancer/include/loadbalancer_events.h
#pragma once

#include "esp_event.h"
#include <stdint.h>
#include <stdbool.h>
#include "esp_timer.h"

#ifdef __cplusplus
extern "C" {
#endif

ESP_EVENT_DECLARE_BASE(LOADBALANCER_EVENTS);

typedef enum {
    LOADBALANCER_EVENT_INIT = 0,
    LOADBALANCER_EVENT_STATE_CHANGED,
    LOADBALANCER_EVENT_GLOBAL_CURRENT_LIMIT,

    // IMPORTANT: eventos separados e payloads diferentes
    LOADBALANCER_EVENT_MASTER_CURRENT_LIMIT,
    LOADBALANCER_EVENT_SLAVE_CURRENT_LIMIT,

    LOADBALANCER_EVENT_SLAVE_STATUS
} loadbalancer_event_id_t;

typedef struct {
    bool     enabled;
    int64_t  timestamp_us;
} loadbalancer_state_event_t;

typedef struct {
    float    limit;
    int64_t  timestamp_us;
} loadbalancer_global_limit_event_t;

// MASTER: NÃO tem slave_id
typedef struct {
    uint16_t max_current;
    int64_t  timestamp_us;
} loadbalancer_master_limit_event_t;

// SLAVE: tem slave_id
typedef struct {
    uint8_t  slave_id;
    uint16_t max_current;
    int64_t  timestamp_us;
} loadbalancer_slave_limit_event_t;

typedef struct {
    uint8_t  slave_id;
    bool     charging;
    float    hw_max_current;
    float    runtime_current;
    int64_t  timestamp_us;
} loadbalancer_slave_status_event_t;

#ifdef __cplusplus
}
#endif
