#ifndef ACOUSTIC_ANALYZER_CORE_GCC_PHAT_LOCALIZER_H_
#define ACOUSTIC_ANALYZER_CORE_GCC_PHAT_LOCALIZER_H_

#include <Eigen/Core>
#include <memory>
#include <utility>
#include <vector>

#include "acoustic_analyzer/core/types.h"

namespace acoustic {

/**
 * @brief 基于 GCC-PHAT 的声源定位器
 *
 * 利用麦克风阵列时延估计 (TDOA) 计算声源方位角与俯仰角。
 */
class GccPhatLocalizer {
   public:
    /**
     * @brief 构造定位器
     * @param mic_config   麦克风阵列几何配置
     * @param sample_rate  采样率 (Hz)
     * @param max_tdoa     最大允许时延 (秒)
     * @param interp_factor 互相关插值倍数
     */
    GccPhatLocalizer(const MicArrayConfig& mic_config,
                     int sample_rate,
                     float max_tdoa,
                     int interp_factor = 4);

    ~GccPhatLocalizer();

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

    /**
     * @brief 对多通道音频帧进行定位
     * @param multi_channel_audio 多通道音频矩阵 (num_samples × num_mics) 或扁平化等效
     * @return (azimuth, elevation) 单位：度
     */
    std::pair<float, float> Localize(const Eigen::MatrixXf& multi_channel_audio);

    /**
     * @brief 使用 std::vector 便捷接口
     */
    std::pair<float, float> Localize(const std::vector<float>& flat_samples,
                                     std::size_t num_channels);

    const MicArrayConfig& MicConfig() const noexcept;

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

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_GCC_PHAT_LOCALIZER_H_
