#ifndef ACOUSTIC_ANALYZER_CORE_FFT_UTILS_H_
#define ACOUSTIC_ANALYZER_CORE_FFT_UTILS_H_

#include <complex>
#include <cstddef>
#include <memory>
#include <vector>

namespace acoustic {

// 自由函数声明（供 FeatureExtractor 内部使用）
void apply_preemphasis(const float* in, float* out, std::size_t n, float coef);
void compute_power_spectrum(const float* frame, int n_fft, float* power_out);

/**
 * @brief FFT 计算工具类
 *
 * 提供复数 FFT 与功率谱计算（内联实现，无外部库依赖）。
 */
class FftUtils {
   public:
    /**
     * @brief 构造时预分配 FFT 计划
     * @param nfft FFT 长度
     */
    explicit FftUtils(std::size_t nfft);

    ~FftUtils();

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

    /**
     * @brief 复数 FFT 前向变换
     * @param input  输入复数序列，长度 = nfft
     * @param output 输出复数频谱，长度 = nfft
     */
    void ComputeFft(const std::vector<std::complex<float>>& input,
                    std::vector<std::complex<float>>& output);

    /**
     * @brief 实数功率谱计算
     * @param input  输入实数序列，长度 = nfft
     * @param output 输出功率谱（单边或双边），长度 = nfft / 2 + 1
     */
    void ComputePowerSpectrum(const std::vector<float>& input,
                              std::vector<float>& output);

    std::size_t Nfft() const noexcept;

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

}  // namespace acoustic

#endif  // ACOUSTIC_ANALYZER_CORE_FFT_UTILS_H_
