#ifndef ACOUSTIC_ANALYZER_CORE_GUNSHOT_CLASSIFIER_H_
#define ACOUSTIC_ANALYZER_CORE_GUNSHOT_CLASSIFIER_H_

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

#include "acoustic_analyzer/core/types.h"

namespace acoustic {

/**
 * @brief 基于 ONNX Runtime 的枪声/爆炸声分类器
 */
class GunshotClassifier {
   public:
    /**
     * @brief 使用配置构造分类器并加载模型
     * @param config 分类器配置（模型路径、标签映射等）
     */
    explicit GunshotClassifier(const ClassifierConfig& config);

    ~GunshotClassifier();

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

    /**
     * @brief 对单通道 Mel Spectrogram 进行推理
     * @param mel_spectrogram Mel 频谱图 (n_mels × time_frames)
     * @return (预测标签, 置信度)
     */
    std::pair<std::string, float> Predict(const Eigen::MatrixXf& mel_spectrogram);

    /**
     * @brief 获取模型支持的所有标签名
     */
    const std::vector<std::string>& Labels() const noexcept;

    /**
     * @brief 模型是否成功加载
     */
    bool IsLoaded() const noexcept;

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

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_GUNSHOT_CLASSIFIER_H_
