#ifndef AV_CODEC_AUDIO_DECODER_H
#define AV_CODEC_AUDIO_DECODER_H

#include "codec_abstract_codec.h"
#include <vector>
#include <string>
#include <memory>
#include <mutex>
#include <functional>
#include <chrono>

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/samplefmt.h>
#include <libswresample/swresample.h>
}

namespace av {
namespace codec {

/**
 * 音频解码器参数
 */
struct AudioDecoderParams : public CodecParams {
    std::string codecName;          // 解码器名称 (如 "aac", "mp3", "opus")
    int sampleRate = 44100;         // 采样率
    int channels = 2;               // 声道数
    AVSampleFormat sampleFormat = AV_SAMPLE_FMT_S16; // 采样格式
    int threadCount = 0;            // 线程数 (0=自动)
    bool lowLatency = false;        // 低延迟模式
    bool enableResampling = true;   // 启用重采样
    
    AudioDecoderParams() {
        type = MediaType::AUDIO;
    }
};

/**
 * 音频解码器类
 * 提供音频解码功能，支持多种音频格式
 */
class AudioDecoder : public AbstractDecoder {
public:
    /**
     * 解码统计信息
     */
    struct DecoderStats {
        uint64_t decodedFrames = 0;     // 已解码帧数
        uint64_t resampledFrames = 0;   // 重采样帧数
        uint64_t totalSamples = 0;      // 总采样数
        uint64_t totalBytes = 0;        // 总字节数
        uint64_t errorCount = 0;        // 错误次数
        double avgDecodeTime = 0.0;     // 平均解码时间(ms)
        double totalDecodeTime = 0.0;   // 总解码时间(ms)
    };
    
    /**
     * 帧回调函数类型
     */
    using FrameCallback = std::function<void(const AVFramePtr&)>;
    
public:
    AudioDecoder();
    virtual ~AudioDecoder();
    
    // 基础接口实现
    ErrorCode open(const CodecParams& params) override;
    void close() override;
    ErrorCode flush() override;
    ErrorCode reset() override;
    
    // 初始化方法
    ErrorCode initialize(const CodecParams& params);
    
    /**
     * 解码音频包
     * @param packet 输入音频包 (nullptr表示刷新解码器)
     * @param frames 输出解码后的音频帧
     * @return 错误码
     */
    ErrorCode decode(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames) override;
    
    /**
     * 完成解码，刷新解码器缓冲区
     * @param frames 输出剩余的音频帧
     * @return 错误码
     */
    ErrorCode finishDecode(std::vector<AVFramePtr>& frames) override;
    
    /**
     * 设置帧回调函数
     * @param callback 回调函数
     */
    void setFrameCallback(const FrameCallback& callback) { frameCallback_ = callback; }
    
    // 状态查询
    std::string getDecoderName() const;
    bool isResamplingEnabled() const;
    DecoderStats getStats() const;
    void resetStats();
    
    // 静态工具方法
    static std::vector<std::string> getSupportedDecoders();
    static bool isDecoderSupported(const std::string& codecName);
    static std::string getRecommendedDecoder(const std::string& codecName = "");
    
    /**
     * 音频解码器工厂
     */
    class AudioDecoderFactory {
    public:
        /**
         * 创建指定解码器
         * @param codecName 解码器名称
         * @return 解码器实例
         */
        static std::unique_ptr<AudioDecoder> create(const std::string& codecName);
        
        /**
         * 创建最佳解码器
         * @return 解码器实例
         */
        static std::unique_ptr<AudioDecoder> createBest();
    };
    
protected:
    bool validateParams(const CodecParams& params) override;
    
private:
    // 内部实现方法
    ErrorCode initDecoder();
    ErrorCode setupDecoderParams();
    ErrorCode decodeFrame(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames);
    ErrorCode receiveFrames(std::vector<AVFramePtr>& frames);
    
    // 音频格式转换
    AVFramePtr convertFrame(AVFramePtr frame);
    ErrorCode setupResampler(const AVFrame* inputFrame);
    void cleanupResampler();
    
    // 统计更新
    void updateStats(bool success, double decodeTime, size_t dataSize, int samples);
    
    // 静态方法
    static void findUsableDecoders();
    
private:
    // 解码器相关
    const AVCodec* codec_ = nullptr;
    AVCodecContextPtr codecCtx_;
    AudioDecoderParams audioParams_;
    
    // 音频重采样
    SwrContext* swrCtx_ = nullptr;
    bool needResampling_ = false;
    
    // 统计信息
    mutable std::mutex statsMutex_;
    DecoderStats stats_;
    
    // 回调函数
    FrameCallback frameCallback_;
    
    // 线程安全
    std::mutex decodeMutex_;
    
    // 静态成员
    static std::vector<std::string> supportedDecoders_;
    static std::once_flag decodersInitFlag_;
    
public:
    // 支持的音频解码器列表
    static constexpr const char* AUDIO_DECODERS[] = {
        // 常用音频解码器
        "aac",
        "mp3",
        "mp3float",
        "opus",
        "vorbis",
        "flac",
        "pcm_s16le",
        "pcm_s24le",
        "pcm_s32le",
        "pcm_f32le",
        "pcm_f64le",
        "ac3",
        "eac3",
        "dts",
        "truehd",
        "wmav1",
        "wmav2",
        "wmalossless",
        "wmapro",
        "g722",
        "g726",
        "adpcm_ima_wav",
        "adpcm_ms",
        "alac",
        "ape",
        "wavpack",
        nullptr
    };
};

} // namespace codec
} // namespace av

#endif // AV_CODEC_AUDIO_DECODER_H