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

// ========================
// Estado interno
// ========================

static bool     limit_reached              = false;
static uint32_t consumption_limit          = 0;
static uint32_t charging_time_limit        = 0;
static uint16_t under_power_limit          = 0;

static uint32_t default_consumption_limit  = 0;
static uint32_t default_charging_time_limit = 0;
static uint16_t default_under_power_limit  = 0;

// ========================
// Estado de controle
// ========================

void evse_set_limit_reached(uint8_t value) {
    limit_reached = (value != 0);
}

bool evse_is_limit_reached(void) {
    return limit_reached;
}

// ========================
// Limites em tempo de execução
// ========================

uint32_t evse_get_consumption_limit(void) {
    return consumption_limit;
}

void evse_set_consumption_limit(uint32_t value) {
    consumption_limit = value;
}

uint32_t evse_get_charging_time_limit(void) {
    return charging_time_limit;
}

void evse_set_charging_time_limit(uint32_t value) {
    charging_time_limit = value;
}

uint16_t evse_get_under_power_limit(void) {
    return under_power_limit;
}

void evse_set_under_power_limit(uint16_t value) {
    under_power_limit = value;
}

// ========================
// Limites padrão (persistentes)
// ========================

uint32_t evse_get_default_consumption_limit(void) {
    return default_consumption_limit;
}

void evse_set_default_consumption_limit(uint32_t value) {
    default_consumption_limit = value;
}

uint32_t evse_get_default_charging_time_limit(void) {
    return default_charging_time_limit;
}

void evse_set_default_charging_time_limit(uint32_t value) {
    default_charging_time_limit = value;
}

uint16_t evse_get_default_under_power_limit(void) {
    return default_under_power_limit;
}

void evse_set_default_under_power_limit(uint16_t value) {
    default_under_power_limit = value;
}

// ========================
// Lógica de verificação de limites
// ========================

void evse_limits_check(evse_state_t state) {
    // Se algum limite estiver ativo, verifique o estado
    if ((consumption_limit > 0 || charging_time_limit > 0 || under_power_limit > 0)
        && evse_state_is_charging(state)) {
        // (Lógica real a ser aplicada aqui, ex: medição de consumo, tempo ou potência)
        evse_set_limit_reached(1);
    }
}
