#include "driver/spi_master.h"
#include "esp_log.h"
#include "adc121s021_dma.h"
#include "spi_bus_manager.h"

#define TAG "adc_dma"

#define PIN_NUM_CS          5
#define SAMPLE_SIZE_BYTES   2
#define ADC_BITS            12
#define SPI_CLOCK_HZ        (6 * 1000 * 1000)  // 6 MHz

static spi_device_handle_t adc_spi = NULL;

void adc121s021_dma_init(void)
{
    if (adc_spi) {
        ESP_LOGW(TAG, "ADC121S021 já foi inicializado.");
        return;
    }

    if (!spi_bus_manager_is_initialized()) {
        ESP_LOGI(TAG, "SPI bus não inicializado. Inicializando...");
        esp_err_t err = spi_bus_manager_init();  // 🔧 CORRIGIDO: sem argumentos
        if (err != ESP_OK) {
            ESP_LOGE(TAG, "Falha ao inicializar o SPI bus: %s", esp_err_to_name(err));
            return;
        }
    }

    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = SPI_CLOCK_HZ,
        .mode = 0,
        .spics_io_num = PIN_NUM_CS,
        .queue_size = 2,
        .flags = SPI_DEVICE_NO_DUMMY,
        .pre_cb = NULL,
        .post_cb = NULL,
    };

    esp_err_t err = spi_bus_add_device(spi_bus_manager_get_host(), &devcfg, &adc_spi);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Falha ao registrar ADC121S021 no SPI: %s", esp_err_to_name(err));
        return;
    }

    ESP_LOGI(TAG, "ADC121S021 registrado no SPI com sucesso.");
}

bool adc121s021_dma_get_sample(uint16_t *sample)
{
    if (!adc_spi) {
        ESP_LOGE(TAG, "ADC SPI não inicializado!");
        return false;
    }

    uint8_t tx_buffer[2] = {0x00, 0x00};  // Dummy
    uint8_t rx_buffer[2] = {0};

    spi_transaction_t t = {
        .length = 16,
        .tx_buffer = tx_buffer,
        .rx_buffer = rx_buffer,
        .flags = 0
    };

    esp_err_t err = spi_device_transmit(adc_spi, &t);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Erro na transmissão SPI: %s", esp_err_to_name(err));
        return false;
    }

    *sample = ((rx_buffer[0] << 8) | rx_buffer[1]) & 0x0FFF;
    return true;
}
