#ifndef ACOUSTIC_ANALYZER_CORE_AUDIO_BUFFER_H_
#define ACOUSTIC_ANALYZER_CORE_AUDIO_BUFFER_H_

#include <atomic>
#include <cstddef>
#include <cstdint>
#include <vector>

namespace acoustic {

/**
 * @brief 音频循环缓冲区
 *
 * 支持多通道音频数据的线程安全（单生产者单消费者）循环存储。
 */
class AudioBuffer {
   public:
    /**
     * @brief 构造循环缓冲区
     * @param capacity_samples 单通道最大采样容量
     * @param num_channels     通道数
     */
    AudioBuffer(std::size_t capacity_samples, std::size_t num_channels = 1);

    ~AudioBuffer() = default;

    // 禁止拷贝，允许移动
    AudioBuffer(const AudioBuffer&) = delete;
    AudioBuffer& operator=(const AudioBuffer&) = delete;
    AudioBuffer(AudioBuffer&&) = default;
    AudioBuffer& operator=(AudioBuffer&&) = default;

    /**
     * @brief 向缓冲区写入音频数据
     * @param samples 扁平化数据：[ch0_s0, ch1_s0, ..., chN_s0, ch0_s1, ...]
     * @return 实际写入的采样帧数（每帧 = num_channels 个 sample）
     */
    std::size_t Push(const std::vector<float>& samples);

    /**
     * @brief 从缓冲区读取并移除数据
     * @param num_frames 希望读取的采样帧数
     * @return 扁平化音频数据，长度 <= num_frames * num_channels
     */
    std::vector<float> Pop(std::size_t num_frames);

    /**
     * @brief 查看缓冲区中数据，不移除
     * @param offset   起始帧偏移
     * @param num_frames 希望读取的采样帧数
     * @return 扁平化音频数据
     */
    std::vector<float> Get(std::size_t offset, std::size_t num_frames) const;

    /**
     * @brief 当前缓冲区中的采样帧数
     */
    std::size_t Size() const noexcept;

    /**
     * @brief 缓冲区最大容量（采样帧数）
     */
    std::size_t Capacity() const noexcept;

    /**
     * @brief 清空缓冲区
     */
    void Clear();

    std::size_t NumChannels() const noexcept;

   private:
    std::size_t capacity_frames_;
    std::size_t num_channels_;
    std::vector<float> buffer_;  ///< 循环存储区
    std::atomic<std::size_t> head_{0};       ///< 写入位置
    std::atomic<std::size_t> tail_{0};       ///< 读取位置
    std::atomic<std::size_t> size_{0};       ///< 当前有效帧数
};

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_AUDIO_BUFFER_H_
