#ifndef ACOUSTIC_ANALYZER_CORE_FEATURE_EXTRACTOR_H_
#define ACOUSTIC_ANALYZER_CORE_FEATURE_EXTRACTOR_H_

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

namespace acoustic {

/**
 * @brief Mel Spectrogram 特征提取器
 *
 * 将时域音频信号转换为 Mel 频谱图，用于后续深度学习分类。
 */
class FeatureExtractor {
   public:
    /**
     * @brief 构造特征提取器
     * @param sample_rate   采样率 (Hz)
     * @param n_fft         FFT 长度
     * @param hop_length    帧移样本数
     * @param n_mels        Mel 滤波器数量
     * @param f_min         最低频率 (Hz)
     * @param f_max         最高频率 (Hz)
     * @param preemphasis   预加重系数
     */
    FeatureExtractor(int sample_rate,
                     int n_fft,
                     int hop_length,
                     int n_mels,
                     float f_min = 0.0f,
                     float f_max = 8000.0f,
                     float preemphasis = 0.97f);

    ~FeatureExtractor();

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

    /**
     * @brief 计算单通道 Mel Spectrogram
     * @param audio_samples 单通道音频采样，float32
     * @return Mel 频谱图矩阵 (n_mels × num_frames)
     */
    Eigen::MatrixXf MelSpectrogram(const std::vector<float>& audio_samples);

    /**
     * @brief 计算多通道 Mel Spectrogram
     * @param audio_samples 多通道扁平化音频 [ch0_s0, ch1_s0, ..., ch0_s1, ...]
     * @param num_channels  通道数
     * @return 每个通道对应的 Mel 频谱图列表
     */
    std::vector<Eigen::MatrixXf> MelSpectrogramMultiChannel(
        const std::vector<float>& audio_samples,
        std::size_t num_channels);

    int SampleRate() const noexcept;
    int NFFT() const noexcept;
    int HopLength() const noexcept;
    int NMels() const noexcept;

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

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_FEATURE_EXTRACTOR_H_
