#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

#include "rcm.h"
#include "board_config.h"
#include "evse_api.h"

static const char *TAG = "RCM";

void rcm_init(void)
{
    if (!board_config.rcm) {
        ESP_LOGW(TAG, "RCM não está habilitado na configuração.");
        return;
    }

    // Configura GPIO de teste como saída
    gpio_config_t output_conf = {
        .mode = GPIO_MODE_OUTPUT,
        .pin_bit_mask = BIT64(board_config.rcm_test_gpio),
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE
    };
    ESP_ERROR_CHECK(gpio_config(&output_conf));

    // Configura GPIO de leitura como entrada
    gpio_config_t input_conf = {
        .mode = GPIO_MODE_INPUT,
        .pin_bit_mask = BIT64(board_config.rcm_gpio),
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE
    };
    ESP_ERROR_CHECK(gpio_config(&input_conf));

    ESP_LOGI(TAG, "RCM inicializado com sucesso.");
}

bool rcm_test(void)
{
    if (!board_config.rcm) {
        //ESP_LOGW(TAG, "Tentativa de teste com RCM desabilitado.");
        return true;
    }

    gpio_set_level(board_config.rcm_test_gpio, 1);
    vTaskDelay(pdMS_TO_TICKS(100));

    bool success = gpio_get_level(board_config.rcm_gpio) == 1;

    gpio_set_level(board_config.rcm_test_gpio, 0);

    ESP_LOGI(TAG, "Teste RCM: %s", success ? "PASSOU" : "FALHOU");
    return success;
}

bool rcm_is_triggered(void)
{
    if (!board_config.rcm) {
        //ESP_LOGW(TAG, "Verificação de trigger com RCM desabilitado.");
        return false;
    }

    if (gpio_get_level(board_config.rcm_gpio) == 1) {
        vTaskDelay(pdMS_TO_TICKS(1));
        return gpio_get_level(board_config.rcm_gpio) == 1;
    }

    return false;
}
