#ifndef AV_RECORDER_VIDEO_RECORDER_H
#define AV_RECORDER_VIDEO_RECORDER_H

#include "recorder_abstract_recorder.h"
#include "../capture/capture_video_capturer.h"
#include "../codec/codec_video_encoder.h"
#include "../muxer/muxer_abstract_muxer.h"
#include "../muxer/muxer_file_muxer.h"
#include "../utils/utils_thread_pool.h"
#include "../utils/utils_frame_queue.h"
#include <memory>
#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <deque>

namespace av {
namespace recorder {

/**
 * 视频采集方法
 */
enum class VideoCaptureMethod {
    SCREEN_CAPTURE,     // 屏幕采集
    WINDOW_CAPTURE,     // 窗口采集
    CAMERA_CAPTURE      // 摄像头采集
};

/**
 * 视频录制器参数
 */
struct VideoRecorderParams : public RecorderParams {
    // 视频采集参数
    VideoCaptureMethod captureMethod = VideoCaptureMethod::SCREEN_CAPTURE;
    std::string deviceId;               // 设备ID（摄像头）或显示器索引
    void* windowHandle = nullptr;       // 窗口句柄（窗口采集）
    int monitorIndex = 0;               // 显示器索引（屏幕采集）
    
    // 视频参数
    uint32_t width = 1920;              // 视频宽度
    uint32_t height = 1080;             // 视频高度
    uint32_t frameRate = 30;            // 帧率
    AVPixelFormat pixelFormat = AV_PIX_FMT_YUV420P;
    
    // 编码参数
    std::string codecName = "libx264";  // 编码器名称（使用libx264软件编码器）
    uint32_t bitrate = 5000000;         // 比特率 (5Mbps)
    uint32_t keyFrameInterval = 30;     // 关键帧间隔
    std::string preset = "medium";      // 编码预设
    
    // 采集选项
    bool drawCursor = true;             // 是否绘制鼠标光标
    bool captureAudio = false;          // 是否同时采集音频
    
    VideoRecorderParams() {
        mediaType = MediaType::VIDEO;
        format = "mp4";
    }
};

/**
 * 视频录制器
 * 支持屏幕录制、窗口采集、摄像头录制等功能
 */
class VideoRecorder : public AbstractRecorder {
public:
    VideoRecorder();
    virtual ~VideoRecorder();

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

    // 视频特定功能
    /**
     * 设置采集源
     */
    ErrorCode setCaptureSource(VideoCaptureMethod method, const std::string& source);
    
    /**
     * 设置窗口采集源
     */
    ErrorCode setCaptureWindow(void* windowHandle);
    
    /**
     * 设置显示器采集源
     */
    ErrorCode setCaptureMonitor(int monitorIndex);
    
    /**
     * 获取当前帧（用于预览）
     */
    AVFramePtr getCurrentFrame() const;
    
    /**
     * 设置是否绘制光标
     */
    void setDrawCursor(bool draw);
    
    /**
     * 获取采集统计信息
     */
    struct CaptureStats {
        double actualFrameRate = 0.0;      // 实际帧率
        double captureOverhead = 0.0;      // 采集开销(ms)
        double encodeTime = 0.0;            // 编码时间(ms)
        uint64_t droppedFrames = 0;         // 丢帧数
        bool isOverloaded = false;          // 是否过载
    };
    
    CaptureStats getCaptureStats() const;
    
    /**
     * 获取可用的采集设备
     */
    std::vector<std::string> getAvailableDevices(VideoCaptureMethod method) const;
    
    /**
     * 获取支持的分辨率列表
     */
    std::vector<std::pair<uint32_t, uint32_t>> getSupportedResolutions() const;

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

private:
    /**
     * 视频处理线程
     */
    void videoProcessingThread();
    
    /**
     * 帧率控制线程
     */
    void frameRateControlThread();
    
    /**
     * 视频帧回调
     */
    void onVideoFrameCaptured(const AVFramePtr& frame);
    
    /**
     * 编码完成回调
     */
    void onVideoPacketEncoded(const AVPacketPtr& packet);
    
    /**
     * 初始化采集器
     */
    ErrorCode initializeCapturer();
    
    /**
     * 初始化编码器
     */
    ErrorCode initializeEncoder();
    
    /**
     * 初始化复用器
     */
    ErrorCode initializeMuxer();
    
    /**
     * 处理视频帧
     */
    AVFramePtr processVideoFrame(AVFramePtr frame);
    
    /**
     * 计算帧率
     */
    void calculateActualFrameRate();
    
    /**
     * 检查是否过载
     */
    bool checkOverload() const;
    
    /**
     * 清理资源
     */
    void cleanup();

private:
    VideoRecorderParams videoParams_;
    
    // 采集器
    std::unique_ptr<capture::VideoCapturer> capturer_;
    
    // 编码器
    std::unique_ptr<codec::VideoEncoder> encoder_;
    
    // 复用器
    std::unique_ptr<muxer::AbstractMuxer> muxer_;
    
    // 线程池
    std::unique_ptr<utils::ThreadPool> threadPool_;
    
    // 处理线程
    std::unique_ptr<std::thread> processingThread_;
    std::unique_ptr<std::thread> frameRateThread_;
    std::atomic<bool> shouldStop_;
    
    // 帧队列
    std::unique_ptr<utils::FrameQueue> frameQueue_;
    
    // 当前帧（用于预览）
    mutable std::mutex currentFrameMutex_;
    AVFramePtr currentFrame_;
    
    // 帧率控制
    std::atomic<bool> isPaused_;
    std::chrono::steady_clock::time_point lastFrameTime_;
    std::chrono::microseconds frameInterval_;
    
    // 统计信息
    mutable std::mutex statsMutex_;
    CaptureStats captureStats_;
    
    // 帧率计算
    std::deque<std::chrono::steady_clock::time_point> frameTimestamps_;
    static constexpr size_t MAX_FRAME_TIMESTAMPS = 60; // 保留最近60帧的时间戳
    
    // 性能监控
    std::chrono::steady_clock::time_point lastCaptureTime_;
    std::chrono::steady_clock::time_point lastEncodeTime_;
    double avgCaptureTime_;
    double avgEncodeTime_;
    
    // 丢帧检测
    static constexpr int OVERLOAD_THRESHOLD_MS = 50; // 50ms阈值
    std::atomic<uint64_t> consecutiveDrops_;
    
    // 同步
    std::condition_variable frameCondition_;
    std::mutex frameMutex_;
};

} // namespace recorder
} // namespace av

#endif // AV_RECORDER_VIDEO_RECORDER_H