/**
 * @file ModernStyleManager.h
 * @brief 现代化样式管理器 - 专为学术项目优化
 * @author Qt UI Optimizer
 * @date 2024-07-03
 * @version 4.0
 * 
 * 特点：
 * - Qt 5.15完全兼容
 * - 学术演示优化
 * - 性能优化
 * - 统一样式管理
 */

#ifndef MODERNSTYLEMANAGER_H
#define MODERNSTYLEMANAGER_H

#include <QObject>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTableWidget>
#include <QApplication>
#include <QTimer>
#include <QPropertyAnimation>
#include <QEasingCurve>
#include <QGraphicsDropShadowEffect>
#include <QMap>
#include <QStringList>

// 前向声明
class DeviceListPanel;
class DeviceCard;

/**
 * @class ModernStyleManager
 * @brief 现代化样式管理器
 * 
 * 提供统一的样式管理和应用功能，专门针对学术项目需求优化。
 * 支持主题切换、演示模式、高对比度模式等功能。
 */
class ModernStyleManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 主题类型枚举
     */
    enum class ThemeType {
        ModernMilitary,     ///< 现代军事主题
        ClassicMilitary,    ///< 经典军事主题
        Academic,           ///< 学术主题
        HighContrast        ///< 高对比度主题
    };

    /**
     * @brief 显示模式枚举
     */
    enum class DisplayMode {
        Normal,             ///< 正常模式
        Presentation,       ///< 演示模式（大字体）
        HighContrast        ///< 高对比度模式
    };

    /**
     * @brief 按钮样式类型枚举
     */
    enum class ButtonStyle {
        Primary,            ///< 主要按钮
        Success,            ///< 成功按钮
        Warning,            ///< 警告按钮
        Danger,             ///< 危险按钮
        Info                ///< 信息按钮
    };

    /**
     * @brief 获取单例实例
     * @return 样式管理器实例
     */
    static ModernStyleManager* getInstance();

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

    // 主题管理
    /**
     * @brief 应用主题
     * @param theme 主题类型
     * @return 是否成功
     */
    bool applyTheme(ThemeType theme);

    /**
     * @brief 设置显示模式
     * @param mode 显示模式
     */
    void setDisplayMode(DisplayMode mode);

    /**
     * @brief 获取当前主题
     * @return 当前主题类型
     */
    ThemeType getCurrentTheme() const { return m_currentTheme; }

    /**
     * @brief 获取当前显示模式
     * @return 当前显示模式
     */
    DisplayMode getCurrentDisplayMode() const { return m_currentDisplayMode; }

    // 样式应用
    /**
     * @brief 应用按钮样式
     * @param button 按钮指针
     * @param style 按钮样式类型
     */
    void applyButtonStyle(QPushButton* button, ButtonStyle style);

    /**
     * @brief 应用输入框样式
     * @param lineEdit 输入框指针
     */
    void applyInputStyle(QLineEdit* lineEdit);

    /**
     * @brief 应用下拉框样式
     * @param comboBox 下拉框指针
     */
    void applyComboBoxStyle(QComboBox* comboBox);

    /**
     * @brief 应用表格样式
     * @param tableWidget 表格指针
     */
    void applyTableStyle(QTableWidget* tableWidget);

    /**
     * @brief 应用设备面板样式
     * @param panel 设备面板指针
     */
    void applyDevicePanelStyle(DeviceListPanel* panel);

    /**
     * @brief 应用设备卡片样式
     * @param card 设备卡片指针
     */
    void applyDeviceCardStyle(DeviceCard* card);

    // 状态管理
    /**
     * @brief 设置状态指示器样式
     * @param indicator 指示器标签
     * @param status 状态（online/offline/warning）
     */
    void setStatusIndicator(QLabel* indicator, const QString& status);

    /**
     * @brief 设置设备状态样式
     * @param widget 控件指针
     * @param status 状态
     */
    void setDeviceStatus(QWidget* widget, const QString& status);

    // 动画效果
    /**
     * @brief 创建按钮悬停动画
     * @param button 按钮指针
     * @return 动画对象
     */
    QPropertyAnimation* createHoverAnimation(QPushButton* button);

    /**
     * @brief 创建淡入动画
     * @param widget 控件指针
     * @param duration 持续时间
     * @return 动画对象
     */
    QPropertyAnimation* createFadeInAnimation(QWidget* widget, int duration = 300);

    /**
     * @brief 创建滑入动画
     * @param widget 控件指针
     * @param direction 方向（0=左，1=右，2=上，3=下）
     * @param duration 持续时间
     * @return 动画对象
     */
    QPropertyAnimation* createSlideInAnimation(QWidget* widget, int direction = 0, int duration = 300);

    // 工具方法
    /**
     * @brief 刷新所有样式
     */
    void refreshAllStyles();

    /**
     * @brief 清理动画资源
     */
    void cleanupAnimations();

    /**
     * @brief 获取主题样式表内容
     * @param theme 主题类型
     * @return 样式表字符串
     */
    QString getThemeStyleSheet(ThemeType theme);

    /**
     * @brief 保存当前主题设置
     */
    void saveThemeSettings();

    /**
     * @brief 加载主题设置
     */
    void loadThemeSettings();

signals:
    /**
     * @brief 主题应用完成信号
     * @param theme 应用的主题
     * @param success 是否成功
     */
    void themeApplied(ThemeType theme, bool success);

    /**
     * @brief 显示模式改变信号
     * @param mode 新的显示模式
     */
    void displayModeChanged(DisplayMode mode);

    /**
     * @brief 样式刷新完成信号
     */
    void stylesRefreshed();

private slots:
    /**
     * @brief 动画清理定时器槽函数
     */
    void onAnimationCleanupTimer();

private:
    /**
     * @brief 构造函数（私有）
     * @param parent 父对象
     */
    explicit ModernStyleManager(QObject *parent = nullptr);

    /**
     * @brief 初始化样式映射
     */
    void initializeStyleMaps();

    /**
     * @brief 加载样式表文件
     * @param filePath 文件路径
     * @return 样式表内容
     */
    QString loadStyleSheetFile(const QString& filePath);

    /**
     * @brief 应用全局样式表
     * @param styleSheet 样式表内容
     */
    void applyGlobalStyleSheet(const QString& styleSheet);

    /**
     * @brief 创建阴影效果
     * @param widget 控件指针
     * @param blurRadius 模糊半径
     * @param color 阴影颜色
     * @param offset 偏移量
     * @return 阴影效果对象
     */
    QGraphicsDropShadowEffect* createShadowEffect(QWidget* widget, 
                                                 int blurRadius = 10,
                                                 const QColor& color = QColor(0, 0, 0, 80),
                                                 const QPointF& offset = QPointF(0, 2));

private:
    static ModernStyleManager* m_instance;          ///< 单例实例
    
    ThemeType m_currentTheme;                       ///< 当前主题
    DisplayMode m_currentDisplayMode;               ///< 当前显示模式
    
    QMap<QString, QString> m_styleSheetCache;       ///< 样式表缓存
    QMap<ButtonStyle, QString> m_buttonStyleMap;    ///< 按钮样式映射
    QMap<QString, QString> m_statusColorMap;        ///< 状态颜色映射
    
    QMap<QWidget*, QPropertyAnimation*> m_animations; ///< 动画映射
    QTimer* m_cleanupTimer;                         ///< 清理定时器
    
    QString m_currentStyleSheet;                    ///< 当前样式表
};

/**
 * @class ModernStyleUtils
 * @brief 现代样式工具类
 * 
 * 提供便捷的静态方法来应用样式
 */
class ModernStyleUtils
{
public:
    // 快捷样式应用方法
    static void applyPrimaryButton(QPushButton* button);
    static void applySuccessButton(QPushButton* button);
    static void applyWarningButton(QPushButton* button);
    static void applyDangerButton(QPushButton* button);
    
    static void applyOnlineStatus(QLabel* indicator);
    static void applyOfflineStatus(QLabel* indicator);
    static void applyWarningStatus(QLabel* indicator);
    
    static void enablePresentationMode();
    static void enableHighContrastMode();
    static void enableNormalMode();
    
    static void playFadeInAnimation(QWidget* widget);
    static void playSlideInAnimation(QWidget* widget);
};

#endif // MODERNSTYLEMANAGER_H
