/**
 * @file UIInitializationManager.h
 * @brief UI初始化管理器 - 单一职责原则实现
 * @author BattlefieldExplorationSystem Team
 * @date 2024-01-01
 * @version 2.0
 * 
 * 专门负责UI组件的初始化和配置，应用了以下设计模式：
 * - 建造者模式：分步骤构建复杂的UI结构
 * - 策略模式：不同的初始化策略
 * - 单一职责原则：仅负责UI初始化
 * 
 * @note 将MainWindow::setupUI()的复杂逻辑分解为可管理的小函数
 * @since 2.0
 */

#ifndef UIINITIALIZATIONMANAGER_H
#define UIINITIALIZATIONMANAGER_H

// C++标准库头文件
#include <memory>

// Qt头文件
#include <QObject>
#include <QWidget>

// 前向声明
class MainWindow;
class DeviceListPanel;
class SystemLogPanel;
class RightFunctionPanel;
class QSplitter;
class QTimer;
class ConfigManager;

/**
 * @class WindowGeometryCalculator
 * @brief 窗口几何计算器 - 单一职责
 * 
 * 专门负责计算和设置窗口的大小、位置等几何属性。
 * 
 * @since 2.0
 */
class WindowGeometryCalculator
{
public:
    /**
     * @brief 窗口几何配置结构
     */
    struct WindowGeometry {
        int width;              ///< 窗口宽度
        int height;             ///< 窗口高度
        int x;                  ///< 窗口X坐标
        int y;                  ///< 窗口Y坐标
        int minWidth;           ///< 最小宽度
        int minHeight;          ///< 最小高度
    };

    /**
     * @brief 计算最佳窗口几何
     * @param config 配置管理器
     * @return WindowGeometry 窗口几何配置
     */
    static WindowGeometry calculateOptimalGeometry(ConfigManager& config);

    /**
     * @brief 应用窗口几何到目标窗口
     * @param window 目标窗口
     * @param geometry 几何配置
     */
    static void applyGeometry(QWidget* window, const WindowGeometry& geometry);

private:
    /**
     * @brief 获取屏幕几何信息
     * @return QRect 屏幕几何
     */
    static QRect getScreenGeometry();

    /**
     * @brief 计算居中位置
     * @param screenSize 屏幕大小
     * @param windowSize 窗口大小
     * @return QPoint 居中位置
     */
    static QPoint calculateCenterPosition(const QSize& screenSize, const QSize& windowSize);
};

/**
 * @class UIComponentBuilder
 * @brief UI组件建造者 - 建造者模式
 * 
 * 使用建造者模式逐步构建复杂的UI组件层次结构。
 * 
 * @since 2.0
 */
class UIComponentBuilder
{
public:
    /**
     * @brief 构造函数
     * @param mainWindow 主窗口引用
     */
    explicit UIComponentBuilder(MainWindow* mainWindow);

    /**
     * @brief 析构函数
     */
    ~UIComponentBuilder() = default;

    /**
     * @brief 构建系统日志面板
     * @return UIComponentBuilder& 支持链式调用
     */
    UIComponentBuilder& buildSystemLogPanel();

    /**
     * @brief 构建设备列表面板
     * @return UIComponentBuilder& 支持链式调用
     */
    UIComponentBuilder& buildDeviceListPanel();

    /**
     * @brief 构建右侧功能面板
     * @return UIComponentBuilder& 支持链式调用
     */
    UIComponentBuilder& buildRightFunctionPanel();

    /**
     * @brief 构建分割器和布局
     * @return UIComponentBuilder& 支持链式调用
     */
    UIComponentBuilder& buildSplitterLayout();

    /**
     * @brief 完成构建并返回结果
     * @return bool 构建是否成功
     */
    bool finalize();

    /**
     * @brief 获取构建的组件
     * @return 构建的组件指针
     */
    SystemLogPanel* getSystemLogPanel() const { return m_systemLogPanel.get(); }
    DeviceListPanel* getDeviceListPanel() const { return m_deviceListPanel.get(); }
    RightFunctionPanel* getRightFunctionPanel() const { return m_rightFunctionPanel.get(); }
    QSplitter* getLeftPanelSplitter() const { return m_leftPanelSplitter.get(); }

private:
    /**
     * @brief 配置分割器样式
     */
    void configureSplitterStyle();

    /**
     * @brief 设置面板约束
     */
    void setupPanelConstraints();

private:
    MainWindow* m_mainWindow;                                       ///< 主窗口指针
    std::unique_ptr<SystemLogPanel> m_systemLogPanel;              ///< 系统日志面板
    std::unique_ptr<DeviceListPanel> m_deviceListPanel;            ///< 设备列表面板
    std::unique_ptr<RightFunctionPanel> m_rightFunctionPanel;      ///< 右侧功能面板
    std::unique_ptr<QSplitter> m_leftPanelSplitter;                ///< 左侧分割器
    bool m_built;                                                   ///< 构建状态
};

/**
 * @class SignalConnectionManager
 * @brief 信号连接管理器 - 观察者模式
 * 
 * 统一管理组件间的信号槽连接，应用观察者模式。
 * 
 * @since 2.0
 */
class SignalConnectionManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit SignalConnectionManager(QObject* parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~SignalConnectionManager() override = default;

    /**
     * @brief 建立设备面板信号连接
     * @param devicePanel 设备面板
     * @param mainWindow 主窗口
     */
    void connectDevicePanelSignals(DeviceListPanel* devicePanel, MainWindow* mainWindow);

    /**
     * @brief 建立右侧功能面板信号连接
     * @param rightPanel 右侧功能面板
     * @param mainWindow 主窗口
     */
    void connectRightPanelSignals(RightFunctionPanel* rightPanel, MainWindow* mainWindow);

    /**
     * @brief 建立配置管理器信号连接
     * @param configManager 配置管理器
     * @param mainWindow 主窗口
     */
    void connectConfigManagerSignals(ConfigManager* configManager, MainWindow* mainWindow);

    /**
     * @brief 断开所有连接
     */
    void disconnectAll();

private:
    /**
     * @brief 建立现代化信号槽连接
     * @tparam Sender 发送者类型
     * @tparam Signal 信号类型
     * @tparam Receiver 接收者类型
     * @tparam Slot 槽类型
     * @param sender 发送者
     * @param signal 信号
     * @param receiver 接收者
     * @param slot 槽函数
     * @param connectionType 连接类型
     */
    template<typename Sender, typename Signal, typename Receiver, typename Slot>
    void makeConnection(Sender* sender, Signal signal, Receiver* receiver, Slot slot,
                       Qt::ConnectionType connectionType = Qt::AutoConnection);

private:
    std::vector<QMetaObject::Connection> m_connections;     ///< 连接列表
};

/**
 * @class UIInitializationManager
 * @brief UI初始化管理器主类
 * 
 * 协调整个UI初始化过程，应用门面模式为MainWindow提供简化接口。
 * 
 * @since 2.0
 */
class UIInitializationManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param mainWindow 主窗口
     * @param parent 父对象
     */
    explicit UIInitializationManager(MainWindow* mainWindow, QObject* parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~UIInitializationManager() override;

    /**
     * @brief 执行完整的UI初始化
     * @return bool 初始化是否成功
     */
    bool initializeUI();

    /**
     * @brief 初始化窗口几何
     * @return bool 是否成功
     */
    bool initializeWindowGeometry();

    /**
     * @brief 初始化UI组件
     * @return bool 是否成功
     */
    bool initializeComponents();

    /**
     * @brief 初始化信号连接
     * @return bool 是否成功
     */
    bool initializeSignalConnections();

    /**
     * @brief 初始化样式和主题
     * @return bool 是否成功
     */
    bool initializeStyleAndTheme();

    /**
     * @brief 执行最终初始化步骤
     * @return bool 是否成功
     */
    bool finalizeInitialization();

    /**
     * @brief 获取初始化状态
     * @return bool 是否已初始化
     */
    bool isInitialized() const { return m_initialized; }

signals:
    /**
     * @brief UI初始化完成信号
     * @param success 是否成功
     */
    void initializationCompleted(bool success);

    /**
     * @brief 初始化进度信号
     * @param step 当前步骤
     * @param total 总步骤数
     * @param description 步骤描述
     */
    void initializationProgress(int step, int total, const QString& description);

private:
    /**
     * @brief 设置随机数生成器（现代化方式）
     */
    void setupRandomGenerator();

    /**
     * @brief 设置全局样式
     */
    void setupGlobalStyles();

    /**
     * @brief 验证初始化结果
     * @return bool 验证是否通过
     */
    bool validateInitialization();

private:
    MainWindow* m_mainWindow;                                       ///< 主窗口指针
    std::unique_ptr<UIComponentBuilder> m_componentBuilder;         ///< 组件建造者
    std::unique_ptr<SignalConnectionManager> m_connectionManager;   ///< 信号连接管理器
    ConfigManager* m_configManager;                                 ///< 配置管理器
    
    bool m_initialized;                                             ///< 初始化状态
    std::unique_ptr<QTimer> m_initializationTimer;                 ///< 初始化计时器

    // 初始化步骤计数
    static constexpr int TOTAL_INIT_STEPS = 6;                     ///< 总初始化步骤数
};

#endif // UIINITIALIZATIONMANAGER_H