#pragma once

#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include "esp_err.h"

#ifndef CONFIG_LORA_CR
#define CONFIG_LORA_CR 5
#endif

typedef struct {
    int freq_centi_mhz;       // частота у сотих MHz (433.35 MHz => 43335)
    int bw_khz;               // смуга пропускання, кГц
    int sf;                   // spreading factor (5..12)
    int cr;                   // coding rate denominator (4/x)
    int tx_power_dbm;         // вихідна потужність, дБм
    uint16_t preamble_syms;   // довжина прекомбози, символи
    uint8_t payload_len;      // очікувана довжина корисного навантаження (0 = довільна для explicit header)
    bool crc_on;              // включити CRC
    bool iq_invert;           // інверсія IQ (звичайно false)
    bool header_implicit;     // implicit header режим
} lora_params_t;

typedef struct {
    int rssi_dbm;
    int snr_db;
    uint8_t last_status;
} lora_metrics_t;

bool lora_radio_init(bool is_tx_role);
esp_err_t lora_radio_apply_params(const lora_params_t *params);
esp_err_t lora_radio_set_tx_power_dbm(int dbm);
esp_err_t lora_radio_set_frequency_centi_mhz(int freq_centi_mhz);
void lora_radio_get_params(lora_params_t *out);
void lora_radio_tick_tx(void);
void lora_radio_tick_rx(void);
void lora_radio_get_metrics(lora_metrics_t *out);
void lora_radio_get_last_payload(char *out, size_t out_len);
esp_err_t lora_radio_send(const uint8_t *data, size_t len);
