#ifndef ACOUSTIC_ANALYZER_CORE_PIPELINE_H_
#define ACOUSTIC_ANALYZER_CORE_PIPELINE_H_

#include <memory>
#include <string>
#include <vector>

#include "acoustic_analyzer/core/types.h"

namespace acoustic {

// 前向声明
class AudioBuffer;
class FeatureExtractor;
class GunshotClassifier;
class GccPhatLocalizer;
class DistanceEstimator;
class ThreatTracker;

/**
 * @brief 声学分析流水线
 *
 * 组合特征提取 → 分类 → 定位 → 距离估计 → 威胁跟踪的完整处理链。
 */
class Pipeline {
   public:
    /**
     * @brief 使用配置构造流水线
     * @param config 顶层流水线配置
     */
    explicit Pipeline(const PipelineConfig& config);

    ~Pipeline();

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

    /**
     * @brief 处理一帧多通道音频数据
     * @param audio_samples 多通道扁平化音频数据
     * @return 分析结果帧（可能包含威胁列表或 is_clear=true）
     */
    AcousticFrame Process(const std::vector<float>& audio_samples);

    /**
     * @brief 从 YAML 配置文件加载流水线配置
     * @param yaml_path YAML 文件路径
     * @return 解析后的 PipelineConfig
     */
    static PipelineConfig FromYaml(const std::string& yaml_path);

    /**
     * @brief 重置流水线内部所有状态（缓存、Kalman、跟踪器等）
     */
    void Reset();

    const PipelineConfig& Config() const noexcept;

   private:
    class Impl;
    std::unique_ptr<Impl> impl_;
};

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_PIPELINE_H_
