#ifndef ACOUSTIC_ANALYZER_CORE_DISTANCE_ESTIMATOR_H_
#define ACOUSTIC_ANALYZER_CORE_DISTANCE_ESTIMATOR_H_

#include <string>
#include <vector>

#include "acoustic_analyzer/core/types.h"
#include <memory>

namespace acoustic {

/**
 * @brief 基于 SPL (声压级) 衰减模型的距离估计器
 *
 * 使用 Kalman 滤波平滑距离输出。
 */
class DistanceEstimator {
   public:
    /**
     * @brief 构造距离估计器
     * @param config 距离估计配置（参考 SPL、衰减系数、Kalman 噪声等）
     */
    explicit DistanceEstimator(const DistanceConfig& config);

    ~DistanceEstimator();

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

    /**
     * @brief 从原始音频信号计算 SPL (dB)
     * @param audio_signal 单通道音频采样
     * @return 估计的 SPL 值 (dB)
     */
    float ComputeSpl(const std::vector<float>& audio_signal);

    /**
     * @brief 根据 SPL 与声音类别估计距离
     * @param spl        当前帧 SPL (dB)
     * @param sound_type 声音类别 (gunshot / artillery / explosion / threat)
     * @return 估计距离 (米)
     */
    float Estimate(float spl, const std::string& sound_type);

    /**
     * @brief 使用 Kalman 滤波更新距离估计
     * @param raw_distance 原始距离测量值 (米)
     * @return 滤波后距离 (米)
     */
    float UpdateKalman(float raw_distance);

    /**
     * @brief 重置 Kalman 滤波器状态
     */
    void Reset();

    const DistanceConfig& Config() const noexcept;

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

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_DISTANCE_ESTIMATOR_H_
