#pragma once

#include <stdint.h>

#include "driver/i2c_master.h"
#include "esp_err.h"
#include "voice_capture_limits.h"

enum class audio_notification_t : uint8_t {
    DONE = 0,
    FAILED = 1,
    APPROVAL = 2,
};

esp_err_t audio_backend_init(i2c_master_bus_handle_t i2c_bus);
bool audio_backend_notify(audio_notification_t kind);
bool audio_backend_ready(void);

// Bounded 2.56 s PSRAM backlog for connection startup; overflow still aborts.
static constexpr size_t AUDIO_CAPTURE_BYTES = 3528;
enum class CaptureKind : uint8_t { START, PCM, END, CANCEL };
struct AudioCaptureFrame {
    uint64_t id;
    CaptureKind kind;
    size_t size;
    uint8_t pcm[AUDIO_CAPTURE_BYTES];
};
bool audio_backend_record_start(uint64_t id);
void audio_backend_record_stop(bool cancel);
bool audio_backend_take_capture(AudioCaptureFrame *frame);

static constexpr size_t AUDIO_SPEECH_BYTES = 7056;
static constexpr unsigned AUDIO_SPEECH_QUEUE_FRAMES = 8;
bool audio_backend_speech_start(uint32_t id);
bool audio_backend_speech_push(uint32_t id, const uint8_t *pcm, size_t size, bool end = false);
void audio_backend_speech_stop();
bool audio_backend_speech_active(uint32_t id);
