/**
 * @file LeftPanelStyleManager.h
 * @brief 左侧设备管理面板专用样式管理器
 * @details 专门管理左侧面板的视觉样式和交互效果
 * @author UBEES Development Team
 * @date 2024
 */

#ifndef LEFTPANELSTYLEMANAGER_H
#define LEFTPANELSTYLEMANAGER_H

#include <QObject>
#include <QString>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QPropertyAnimation>
#include <QGraphicsDropShadowEffect>
#include <QTimer>
#include <QMap>
#include <QColor>
#include <QPointF>

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

/**
 * @class LeftPanelStyleManager
 * @brief 左侧面板样式管理器
 * @details 专门负责左侧设备管理面板的样式应用和动画效果
 */
class LeftPanelStyleManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取样式管理器单例实例
     * @return LeftPanelStyleManager* 单例指针
     */
    static LeftPanelStyleManager* getInstance();

    /**
     * @brief 应用左侧面板样式
     * @param panel 设备列表面板指针
     * @return bool 成功返回true，失败返回false
     */
    bool applyLeftPanelStyle(DeviceListPanel* panel);

    /**
     * @brief 应用设备卡片样式
     * @param card 设备卡片指针
     * @return bool 成功返回true，失败返回false
     */
    bool applyDeviceCardStyle(DeviceCard* card);

    /**
     * @brief 设置按钮样式类型
     * @param button 按钮指针
     * @param buttonType 按钮类型 ("add", "delete", "refresh", "control", "details", "location")
     */
    void setButtonStyleType(QPushButton* button, const QString& buttonType);

    /**
     * @brief 设置状态指示器样式
     * @param indicator 状态指示器标签
     * @param status 状态类型 ("online", "offline", "warning", "maintenance")
     */
    void setStatusIndicatorStyle(QLabel* indicator, const QString& status);

    /**
     * @brief 设置设备状态标签样式
     * @param statusLabel 状态标签
     * @param status 状态类型
     */
    void setDeviceStatusLabelStyle(QLabel* statusLabel, const QString& status);

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

    /**
     * @brief 创建卡片选择动画
     * @param card 目标卡片
     * @return QPropertyAnimation* 动画对象指针
     */
    QPropertyAnimation* createCardSelectionAnimation(DeviceCard* card);

    /**
     * @brief 创建状态变化动画
     * @param widget 目标控件
     * @param fromStatus 原状态
     * @param toStatus 新状态
     * @return QPropertyAnimation* 动画对象指针
     */
    QPropertyAnimation* createStatusChangeAnimation(QWidget* widget, 
                                                   const QString& fromStatus, 
                                                   const QString& toStatus);

    /**
     * @brief 应用加载动画
     * @param widget 目标控件
     * @param isLoading 是否显示加载状态
     */
    void applyLoadingAnimation(QWidget* widget, bool isLoading);

    /**
     * @brief 设置面板标题样式
     * @param titleLabel 标题标签
     * @param level 标题级别 (1=主标题, 2=副标题, 3=小标题)
     */
    void setPanelTitleStyle(QLabel* titleLabel, int level = 1);

    /**
     * @brief 设置设备计数标签样式
     * @param countLabel 计数标签
     * @param totalCount 总数
     * @param onlineCount 在线数
     */
    void setDeviceCountStyle(QLabel* countLabel, int totalCount, int onlineCount);

    /**
     * @brief 应用空列表提示样式
     * @param emptyLabel 空列表提示标签
     */
    void applyEmptyListStyle(QLabel* emptyLabel);

    /**
     * @brief 刷新所有样式
     * @return bool 成功返回true，失败返回false
     */
    bool refreshAllStyles();

    /**
     * @brief 设备卡片动画类型枚举
     */
    enum class CardAnimation {
        None,           ///< 无动画
        FadeIn,         ///< 淡入
        SlideIn,        ///< 滑入
        ScaleIn,        ///< 缩放进入
        Bounce          ///< 弹跳
    };

    /**
     * @brief 播放设备卡片动画
     * @param card 目标卡片
     * @param animation 动画类型
     * @param duration 动画时长（毫秒）
     */
    void playCardAnimation(DeviceCard* card, CardAnimation animation, int duration = 300);

    /**
     * @brief 按钮状态枚举
     */
    enum class ButtonState {
        Normal,         ///< 正常状态
        Hover,          ///< 悬停状态
        Pressed,        ///< 按下状态
        Disabled        ///< 禁用状态
    };

    /**
     * @brief 更新按钮状态样式
     * @param button 目标按钮
     * @param state 按钮状态
     */
    void updateButtonState(QPushButton* button, ButtonState state);

private:
    /**
     * @brief 私有构造函数（单例模式）
     */
    explicit LeftPanelStyleManager(QObject *parent = nullptr);

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

    /**
     * @brief 禁用拷贝构造函数
     */
    LeftPanelStyleManager(const LeftPanelStyleManager&) = delete;

    /**
     * @brief 禁用赋值操作符
     */
    LeftPanelStyleManager& operator=(const LeftPanelStyleManager&) = delete;

    /**
     * @brief 加载左侧面板样式文件
     * @return bool 成功返回true，失败返回false
     */
    bool loadLeftPanelStyleSheet();

    /**
     * @brief 加载后备样式（当样式文件无法加载时使用）
     */
    void loadFallbackStyles();

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

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

    /**
     * @brief 应用渐变背景
     * @param widget 目标控件
     * @param startColor 起始颜色
     * @param endColor 结束颜色
     * @param direction 渐变方向 (0=垂直, 1=水平, 2=对角线)
     */
    void applyGradientBackground(QWidget* widget, 
                                const QColor& startColor, 
                                const QColor& endColor, 
                                int direction = 0);

private:
    static LeftPanelStyleManager* m_instance;           ///< 单例实例
    QString m_leftPanelStyleSheet;                      ///< 左侧面板样式表
    QMap<QString, QString> m_buttonStyleMap;            ///< 按钮样式映射
    QMap<QString, QString> m_statusColorMap;            ///< 状态颜色映射
    QMap<QWidget*, QPropertyAnimation*> m_animations;   ///< 动画映射表
    QTimer* m_animationTimer;                           ///< 动画定时器

signals:
    /**
     * @brief 样式应用完成信号
     * @param widget 应用样式的控件
     * @param success 是否成功
     */
    void styleApplied(QWidget* widget, bool success);

    /**
     * @brief 动画播放完成信号
     * @param widget 播放动画的控件
     * @param animationType 动画类型
     */
    void animationFinished(QWidget* widget, const QString& animationType);

public slots:
    /**
     * @brief 刷新样式槽函数
     */
    void refreshStyles();

    /**
     * @brief 停止所有动画
     */
    void stopAllAnimations();

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

/**
 * @brief 左侧面板样式工具类
 * @details 提供便捷的左侧面板样式操作静态方法
 */
class LeftPanelStyleUtils
{
public:
    /**
     * @brief 快速应用左侧面板样式
     * @param panel 设备列表面板
     * @return bool 成功返回true，失败返回false
     */
    static bool applyLeftPanelStyle(DeviceListPanel* panel);

    /**
     * @brief 快速设置添加按钮样式
     * @param button 目标按钮
     */
    static void setAddButton(QPushButton* button);

    /**
     * @brief 快速设置删除按钮样式
     * @param button 目标按钮
     */
    static void setDeleteButton(QPushButton* button);

    /**
     * @brief 快速设置刷新按钮样式
     * @param button 目标按钮
     */
    static void setRefreshButton(QPushButton* button);

    /**
     * @brief 快速设置在线状态指示器
     * @param indicator 状态指示器
     */
    static void setOnlineIndicator(QLabel* indicator);

    /**
     * @brief 快速设置离线状态指示器
     * @param indicator 状态指示器
     */
    static void setOfflineIndicator(QLabel* indicator);

    /**
     * @brief 快速设置警告状态指示器
     * @param indicator 状态指示器
     */
    static void setWarningIndicator(QLabel* indicator);

    /**
     * @brief 快速播放卡片添加动画
     * @param card 设备卡片
     */
    static void playCardAddAnimation(DeviceCard* card);

    /**
     * @brief 快速播放卡片删除动画
     * @param card 设备卡片
     */
    static void playCardRemoveAnimation(DeviceCard* card);

    /**
     * @brief 快速播放状态变化动画
     * @param card 设备卡片
     * @param newStatus 新状态
     */
    static void playStatusChangeAnimation(DeviceCard* card, const QString& newStatus);
};

#endif // LEFTPANELSTYLEMANAGER_H
