#ifndef AV_RECORDER_AV_RECORDER_H
#define AV_RECORDER_AV_RECORDER_H

#include "recorder_abstract_recorder.h"
#include "recorder_audio_recorder.h"
#include "recorder_video_recorder.h"
#include "../utils/utils_synchronizer_v2.h"
#include <memory>
#include <atomic>
#include <mutex>

namespace av {
namespace recorder {

/**
 * 音视频录制器参数
 */
struct AVRecorderParams : public RecorderParams {
    // 音频参数
    AudioRecorderParams audioParams;
    bool enableAudio = true;
    
    // 视频参数
    VideoRecorderParams videoParams;
    bool enableVideo = true;
    
    // 同步参数
    bool enableSync = true;             // 是否启用音视频同步
    int64_t syncThresholdMs = 40;       // 同步阈值(毫秒)
    bool dropFrameOnSync = true;        // 同步时是否丢帧
    
    AVRecorderParams() {
        mediaType = MediaType::UNKNOWN; // 表示混合媒体类型
        format = "mp4";
    }
};

/**
 * 音视频录制器
 * 整合音频和视频录制功能，提供同步录制能力
 */
class AVRecorder : public AbstractRecorder {
public:
    AVRecorder();
    virtual ~AVRecorder();

    // 实现基类接口
    ErrorCode initialize(const RecorderParams& params) override;
    ErrorCode startRecording() override;
    ErrorCode stopRecording() override;
    ErrorCode pauseRecording() override;
    ErrorCode resumeRecording() override;
    void close() override;

    // 音视频特定功能
    /**
     * 获取音频录制器
     */
    AudioRecorder* getAudioRecorder() const { return audioRecorder_.get(); }
    
    /**
     * 获取视频录制器
     */
    VideoRecorder* getVideoRecorder() const { return videoRecorder_.get(); }
    
    /**
     * 设置音频启用状态
     */
    ErrorCode setAudioEnabled(bool enabled);
    
    /**
     * 设置视频启用状态
     */
    ErrorCode setVideoEnabled(bool enabled);
    
    /**
     * 独立控制音频采集
     */
    ErrorCode startAudioCapture();
    ErrorCode stopAudioCapture();
    ErrorCode pauseAudioCapture();
    ErrorCode resumeAudioCapture();
    
    /**
     * 独立控制视频采集
     */
    ErrorCode startVideoCapture();
    ErrorCode stopVideoCapture();
    ErrorCode pauseVideoCapture();
    ErrorCode resumeVideoCapture();
    
    /**
     * 实时切换音频/视频流
     */
    ErrorCode toggleAudioRecording(bool enable);
    ErrorCode toggleVideoRecording(bool enable);
    
    /**
     * 获取音频/视频录制状态
     */
    bool isAudioRecording() const;
    bool isVideoRecording() const;
    bool isAudioCapturing() const;
    bool isVideoCapturing() const;
    
    /**
     * 获取同步状态
     */
    struct SyncStatus {
        bool isInSync = true;           // 是否同步
        int64_t audioTimestamp = 0;     // 音频时间戳
        int64_t videoTimestamp = 0;     // 视频时间戳
        int64_t timeDiff = 0;           // 时间差(ms)
        uint64_t droppedAudioFrames = 0; // 丢弃的音频帧
        uint64_t droppedVideoFrames = 0; // 丢弃的视频帧
    };
    
    SyncStatus getSyncStatus() const;
    
    /**
     * 设置同步参数
     */
    void setSyncThreshold(int64_t thresholdMs);
    void setDropFrameOnSync(bool drop);
    
    /**
     * 获取综合统计信息
     */
    struct CombinedStats {
        RecorderStats audioStats;
        RecorderStats videoStats;
        SyncStatus syncStatus;
        double totalRecordingTime = 0.0;
        uint64_t totalFileSize = 0;
    };
    
    CombinedStats getCombinedStats() const;
    
    /**
     * 获取当前预览帧
     */
    AVFramePtr getCurrentVideoFrame() const;
    
    /**
     * 获取当前音频电平
     */
    float getCurrentAudioLevel() const;

protected:
    bool validateParams(const RecorderParams& params) override;

private:
    /**
     * 同步线程
     */
    void synchronizationThread();
    
    /**
     * 音频包回调
     */
    void onAudioPacket(const AVPacketPtr& packet);
    
    /**
     * 视频包回调
     */
    void onVideoPacket(const AVPacketPtr& packet);
    
    /**
     * 检查同步状态
     */
    void checkSyncStatus();
    
    /**
     * 调整同步
     */
    void adjustSync(int64_t timeDiff);
    
    /**
     * 初始化子录制器
     */
    ErrorCode initializeSubRecorders();
    
    /**
     * 初始化同步器
     */
    ErrorCode initializeSynchronizer();
    
    /**
     * 清理资源
     */
    void cleanup();
    
    /**
     * 更新综合统计信息
     */
    void updateCombinedStats();

private:
    AVRecorderParams avParams_;
    
    // 子录制器
    std::unique_ptr<AudioRecorder> audioRecorder_;
    std::unique_ptr<VideoRecorder> videoRecorder_;
    
    // 同步器
    std::unique_ptr<utils::SynchronizerV2> synchronizer_;
    
    // 同步线程
    std::unique_ptr<std::thread> syncThread_;
    std::atomic<bool> shouldStopSync_;
    
    // 同步状态
    mutable std::mutex syncMutex_;
    SyncStatus syncStatus_;
    
    // 时间戳管理
    std::atomic<int64_t> audioTimestamp_;
    std::atomic<int64_t> videoTimestamp_;
    std::chrono::steady_clock::time_point recordingStartTime_;
    
    // 统计信息
    mutable std::mutex statsMutex_;
    CombinedStats combinedStats_;
    
    // 控制标志
    std::atomic<bool> audioEnabled_;
    std::atomic<bool> videoEnabled_;
    std::atomic<bool> syncEnabled_;
    
    // 同步参数
    std::atomic<int64_t> syncThreshold_;
    std::atomic<bool> dropFrameOnSync_;
    
    // 包计数器
    std::atomic<uint64_t> audioPacketCount_;
    std::atomic<uint64_t> videoPacketCount_;
};

/**
 * 录制器工厂类的扩展实现
 */
class RecorderFactoryImpl {
public:
    /**
     * 创建音频录制器
     */
    static std::unique_ptr<AudioRecorder> createAudioRecorder();
    
    /**
     * 创建视频录制器
     */
    static std::unique_ptr<VideoRecorder> createVideoRecorder();
    
    /**
     * 创建音视频录制器
     */
    static std::unique_ptr<AVRecorder> createAVRecorder();
    
    /**
     * 创建录制器（根据媒体类型）
     */
    static std::unique_ptr<AbstractRecorder> createRecorder(MediaType mediaType);
};

} // namespace recorder
} // namespace av

#endif // AV_RECORDER_AV_RECORDER_H