#pragma once

// Qt Core
#include <QMutex>
#include <QStringList>
#include <QTimer>
#include <QWaitCondition>
#include <QWidget>
#include <QRect>
#include <QVector>
#include "qobjectdefs.h"

// Qt Widgets
#include <QPushButton>
#include <QCheckBox>

// Project includes
#include "libs/Recorder/export.h"
#include "widgets/framelessbase.h"  // Use TWidget as base

class QSplitter;

// 移除：UserProfileWidget 前向声明（不再使用）
class ChatWindow;
class RecorderWidget; // forward declaration for standalone recorder
class AVPlayerWidget; // forward declaration for standalone player
class PopoverButtonGroup; // 前向声明：在本类中以指针形式使用
class FunctionButton; // 新增：用于指针成员 m_streamButton 的前向声明
class TMainWindow;    // 新增：用于无边框自定义标题窗口承载弹窗/悬浮工具栏
// Removed RecorderAudioWidget forward declaration; use QComboBox instead
class QComboBox;

class WebSocketClient;
class StatsWidget;
class AudioDeviceSelectorIcon;
class AudioDeviceSelectorIconDecoupled;

namespace ADS {
    class DockManager;
    class DockWidget;
}

/**
 * @brief MainPanel 主面板类
 * 
 * MainPanel是应用程序的核心界面组件，负责管理和协调各个功能模块：
 * - 播放器组件的显示和控制
 * - 聊天窗口的嵌入式和独立显示
 * - 录制和推流功能的控制
 * - 音频设备的选择和管理
 * - 用户界面的布局和模式切换
 * 
 * 该类支持多种显示模式：
 * - 正常模式：分割器布局，左侧播放器，右侧聊天
 * - 推流模式：隐藏聊天面板，专注于推流控制
 * - 独立窗口模式：各组件可以独立弹出显示
 * 
 * @author 开发团队
 * @date 2024
 */
class MainPanel : public TWidget
{
    Q_OBJECT
public:
    // ========== 构造与析构 ==========
    /**
     * @brief 构造函数
     * @param parent 父窗口指针
     */
    explicit MainPanel(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~MainPanel();
    
    // ========== 配置接口 ==========
    /**
     * @brief 设置用户角色列表
     * @param roleList 角色列表，用于权限控制
     */
    void setRole(const QStringList &roleList);
    
    /**
     * @brief 设置推流房间ID
     * @param room 房间ID字符串
     */
    void setPushRoomId(const QString &room);
    
    /**
     * @brief 设置播放器组件
     * @param newPlayer 新的播放器组件指针
     */
    void setPlayerWidget(QWidget *newPlayer);

public slots:
    // ========== 窗口显示控制 ==========
    /**
     * @brief 显示独立的录制窗口
     */
    void showRecorderStandalone();
    
    /**
     * @brief 显示独立的播放器窗口
     */
    void showPlayerStandalone();
    
    /**
     * @brief 显示独立的聊天窗口
     */
    void showChatStandalone();
    
    /**
     * @brief 将聊天窗口嵌入到主面板中
     */
    void showChatEmbedded();

signals:
    // ========== 信号 ==========
    /**
     * @brief 用户点击退出按钮时发出的信号
     */
    void logoutClicked();

private:
    // ========== 播放控制 ==========
    void handleDebouncedPlay();
    
    // ========== 界面布局控制 ==========
    void showFloatingToolbar();
    void hideFloatingToolbar();
    void applyModeLayout();

protected:
    void resizeEvent(QResizeEvent* event) override;
    bool eventFilter(QObject *watched, QEvent *event) override;

private:
    // ========== 核心布局组件 ==========
    QSplitter *splitter = nullptr;
    QWidget *playerContainer = nullptr;
    QWidget *playerWidget = nullptr;
    QWidget *m_rightWidget = nullptr;          // 推流时整体隐藏的右侧面板（含聊天容器）
    
    // ========== 聊天相关组件 ==========
    ChatWindow *chatView = nullptr;            // 统一的聊天窗口实例
    QWidget *m_chatContainer = nullptr;        // 聊天窗口的容器（用于嵌入式显示）
    WebSocketClient *webSocketClient = nullptr;
    
    // ========== 独立窗口组件 ==========
    RecorderWidget *m_recorderStandalone = nullptr;
    AVPlayerWidget *m_avPlayerStandalone = nullptr;
    
    // ========== 窗口框架 ==========
    class TMainWindow *m_recorderFrame = nullptr;
    class TMainWindow *m_playerFrame = nullptr;
    class TMainWindow *m_chatFrame = nullptr;
    class TMainWindow *m_settingsFrame = nullptr;
    TMainWindow *m_compactFrame = nullptr;     // 用于承载"悬浮工具栏"的自定义标题窗口
    
    // ========== 功能按钮组件 ==========
    class PopoverButtonGroup *buttonGroup = nullptr;
    QPushButton *m_recordButton = nullptr;        // 开始录制按钮
    class FunctionButton *m_streamButton = nullptr;        // 开始推流按钮
    class FunctionButton *m_chatButton = nullptr;          // 聊天显示/隐藏/弹出/嵌入切换按钮
    QPushButton *m_settingsButton = nullptr;      // 设置按钮
    QCheckBox *m_drawCursorCheckBox = nullptr;    // 绘制鼠标指针选项
    QCheckBox *m_syncRecordCheckBox = nullptr;    // 推流时同步录制选项
    
    // ========== 音频设备相关 ==========
    AudioDeviceSelectorIcon *m_audioDeviceSelector = nullptr;
    AudioDeviceSelectorIconDecoupled *m_audioDeviceSelectorDecoupled = nullptr;
    QComboBox *m_micWidget = nullptr;         // 麦克风下拉框
    QComboBox *m_speakerWidget = nullptr;     // 扬声器下拉框
    QVector<AMRECORDER_DEVICE> m_micDevices;      // 缓存麦克风设备列表
    QVector<AMRECORDER_DEVICE> m_speakerDevices;  // 缓存扬声器设备列表
    
    // ========== 视频编码器相关 ==========
    QComboBox *m_encoderWidget = nullptr;         // 视频编码器下拉框
    QVector<AMRECORDER_ENCODERS> m_encoderList;   // 缓存编码器列表
    int m_selectedEncoderId = -1;                 // 当前选择的编码器 id
    
    // ========== 播放控制相关 ==========
    bool m_isStartingPlay = false;
    QMutex m_playMutex;
    QWaitCondition m_playCond;
    QTimer *m_debounceTimer = nullptr;
    QString m_pendingRoomId;
    
    // ========== 状态管理 ==========
    bool m_isStreaming = false;               // 推流状态跟踪
    bool m_compactMode = false;               // 极简模式
    QRect m_savedWindowGeometry;              // 窗口几何缓存
    
    // ========== 其他组件 ==========
    StatsWidget *statsWidget = nullptr;
    ADS::DockManager *m_dockManager = nullptr;
    
private:
    // ========== 初始化函数 ==========
    void initPlaybackControls();
    void initChatComponents();
    void initLayoutComponents();
    void initFunctionButtons();
    void connectSignals();
    void initAudioDeviceSelectors();
    
private slots:
    
    // 录制控制按钮的槽函数
    void onRecordButtonClicked();
    void onStreamButtonClicked();
    void onChatButtonClicked();                 // 聊天弹出/嵌入/显示/隐藏按钮槽
    
    // 聊天窗口关闭处理
    void onChatWindowCloseRequested();
};
