#ifndef AV_RECORDER_MAIN_WIDGET_H
#define AV_RECORDER_MAIN_WIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
#include <QComboBox>
#include <QCheckBox>
#include <QSlider>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QLineEdit>
#include <QProgressBar>
#include <QTimer>
#include <QTime>
#include <QGroupBox>
#include <QSplitter>
#include <QStatusBar>
#include <QFileDialog>
#include <QMessageBox>
#include <QApplication>
#include <QDesktopWidget>
#include <QScreen>
#include <QScrollArea>
#include <QTabWidget>
#include <QMutex>
#include <memory>

#include "../recorder.h"
#include "recorder_video_widget.h"
#include "recorder_audio_widget.h"
#include "recorder_settings_dialog.h"

using namespace av::recorder;

/**
 * 录制器主界面
 * 
 * 提供完整的音视频录制功能界面，包括：
 * - 录制控制（开始/停止/暂停/恢复）
 * - 实时预览窗口
 * - 音频控制和监控
 * - 录制设置
 * - 状态显示
 */
class RecorderMainWidget : public QWidget {
    Q_OBJECT

public:
    explicit RecorderMainWidget(QWidget* parent = nullptr);
    ~RecorderMainWidget();

    /**
     * 初始化录制器
     */
    bool initialize();
    
    /**
     * 清理资源
     */
    void cleanup();

public slots:
    /**
     * 开始录制
     */
    void startRecording();
    
    /**
     * 停止录制
     */
    void stopRecording();
    
    /**
     * 暂停录制
     */
    void pauseRecording();
    
    /**
     * 恢复录制
     */
    void resumeRecording();
    
    /**
     * 开始预览
     */
    void startPreview();
    
    /**
     * 停止预览
     */
    void stopPreview();
    
    /**
     * 打开设置对话框
     */
    void openSettings();
    
    /**
     * 选择输出文件
     */
    void selectOutputFile();
    
    /**
     * 更新采集设备列表
     */
    void updateCaptureDevices();
    
    /**
     * 采集源改变
     */
    void onCaptureSourceChanged();
    
    /**
     * 采集方法改变
     */
    void onCaptureMethodChanged();
    
    /**
     * 音频设备改变
     */
    void onAudioDeviceChanged();
    
    /**
     * 音量改变
     */
    void onVolumeChanged(double volume);
    
    /**
     * 静音状态改变
     */
    void onMuteChanged(bool muted);
    
    /**
     * 更新录制状态
     */
    void updateRecordingStatus();
    
    /**
     * 更新预览帧
     */
    void updatePreviewFrame();
    
    /**
     * 更新音频电平
     */
    void updateAudioLevel();
    
    /**
     * 独立音频/视频控制槽函数
     */
    void onAudioStartClicked();
    void onAudioStopClicked();
    void onVideoCaptureClicked();
    void onVideoStopClicked();
    void onAudioEnableChanged(bool enabled);
    void onVideoEnableChanged(bool enabled);
    
    /**
     * 更新独立控制按钮状态
     */
    void updateIndependentControlButtons();

private slots:
    /**
     * 录制器状态改变
     */
    void onRecorderStateChanged(RecorderState state);
    
    /**
     * 录制器错误
     */
    void onRecorderError(const QString& error);
    
    /**
     * 统计信息更新
     */
    void onStatisticsUpdated();

private:
    /**
     * 初始化UI
     */
    void initUI();
    
    /**
     * 初始化控制面板
     */
    void initControlPanel();
    
    /**
     * 初始化独立控制面板
     */
    void initIndependentControlPanel();
    
    /**
     * 初始化预览面板
     */
    void initPreviewPanel();
    
    /**
     * 初始化音频面板
     */
    void initAudioPanel();
    
    /**
     * 初始化设置面板
     */
    void initSettingsPanel();
    
    /**
     * 初始化状态栏
     */
    void initStatusBar();
    
    /**
     * 重置录制器状态以便重新启动
     */
    void resetRecorderForRestart();
    
    /**
     * 初始化连接
     */
    void initConnections();
    
    /**
     * 更新UI状态
     */
    void updateUIState();
    
    /**
     * 获取当前录制参数
     */
    AVRecorderParams getCurrentParams();
    
    /**
     * 应用录制参数
     */
    void applyRecorderParams(const AVRecorderParams& params);
    
    /**
     * 格式化时间
     */
    QString formatTime(int64_t ms);
    
    /**
     * 格式化文件大小
     */
    QString formatFileSize(int64_t bytes);
    
    /**
     * 格式化比特率
     */
    QString formatBitrate(int64_t bps);

private:
    // 录制器
    std::unique_ptr<AVRecorder> m_recorder;
    bool m_isInitialized;
    bool m_isRecording;
    bool m_isPaused;
    bool m_isPreviewActive;
    
    // UI组件 - 主布局
    QSplitter* m_mainSplitter;
    QWidget* m_leftPanel;
    QWidget* m_rightPanel;
    
    // UI组件 - 控制面板
    QGroupBox* m_controlGroup;
    QPushButton* m_recordButton;
    QPushButton* m_pauseButton;
    QPushButton* m_stopButton;
    QPushButton* m_previewButton;
    QPushButton* m_settingsButton;
    QLabel* m_recordTimeLabel;
    QLabel* m_recordStatusLabel;
    
    // 独立控制按钮
    QGroupBox* m_independentControlGroup;
    QPushButton* m_audioStartButton;
    QPushButton* m_audioStopButton;
    QPushButton* m_videoCaptureButton;
    QPushButton* m_videoStopButton;
    QCheckBox* m_audioEnableCheck;
    QCheckBox* m_videoEnableCheck;
    
    // UI组件 - 采集设置
    QGroupBox* m_captureGroup;
    QComboBox* m_captureMethodCombo;
    QComboBox* m_captureSourceCombo;
    QComboBox* m_audioDeviceCombo;
    QPushButton* m_refreshDevicesButton;
    QCheckBox* m_drawCursorCheck;
    QCheckBox* m_captureAudioCheck;
    
    // UI组件 - 输出设置
    QGroupBox* m_outputGroup;
    QLineEdit* m_outputPathEdit;
    QPushButton* m_browseOutputButton;
    QComboBox* m_outputFormatCombo;
    
    // UI组件 - 预览面板
    QGroupBox* m_previewGroup;
    RecorderVideoWidget* m_videoWidget;
    
    // UI组件 - 音频面板
    QGroupBox* m_audioGroup;
    RecorderAudioWidget* m_microphoneWidget;
    RecorderAudioWidget* m_speakerWidget;
    
    // UI组件 - 统计信息
    QGroupBox* m_statsGroup;
    QLabel* m_fpsLabel;
    QLabel* m_bitrateLabel;
    QLabel* m_framesLabel;
    QLabel* m_droppedFramesLabel;
    QLabel* m_fileSizeLabel;
    
    // UI组件 - 状态栏
    QStatusBar* m_statusBar;
    QLabel* m_statusLabel;
    QProgressBar* m_progressBar;
    
    // 定时器
    QTimer* m_updateTimer;
    QTimer* m_previewTimer;
    QTimer* m_audioLevelTimer;
    
    // 录制状态
    QTime m_recordStartTime;
    int64_t m_recordDuration;
    
    // 设置对话框
    RecorderSettingsDialog* m_settingsDialog;
    
    // 线程安全
    QMutex m_mutex;
    
    // 常量
    static constexpr int UPDATE_INTERVAL_MS = 100;
    static constexpr int PREVIEW_INTERVAL_MS = 33; // ~30 FPS
    static constexpr int AUDIO_LEVEL_INTERVAL_MS = 50;
};

#endif // AV_RECORDER_MAIN_WIDGET_H