/**
 * @file DeviceListPanel.h
 * @brief 设备列表面板组件定义
 * @author CasualtySightPlus Team
 * @date 2024-12-01
 * @version 1.0
 * 
 * 设备列表面板组件，用于管理和显示多个设备卡片，包括：
 * - 设备卡片的创建、更新和删除管理
 * - 设备列表的搜索和过滤功能
 * - 设备状态的实时监控和更新
 * - 设备操作的事件处理和转发
 * 
 * @note 依赖Qt GUI模块和设备卡片组件
 * @since 1.0
 */

#ifndef DEVICELISTPANEL_H
#define DEVICELISTPANEL_H

// Qt核心头文件
#include <QWidget>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QComboBox>
#include <QTimer>
#include <QHash>
#include <QList>

// 项目头文件
#include "DeviceCard.h"
#include "core/database/UAVDatabase.h"
#include "core/database/DogDatabase.h"

/**
 * @brief 设备过滤类型枚举
 */
enum class DeviceFilterType
{
    All,        ///< 显示所有设备
    UAV,        ///< 只显示无人机
    Dog,        ///< 只显示机器狗
    Online,     ///< 只显示在线设备
    Offline     ///< 只显示离线设备
};

/**
 * @class DeviceListPanel
 * @brief 设备列表面板组件
 * 
 * 管理和显示多个设备卡片的面板组件。
 * 提供设备的统一管理界面，包括列表显示、搜索过滤、状态监控等功能。
 * 
 * 主要功能：
 * - 设备卡片管理：动态创建、更新和删除设备卡片
 * - 搜索过滤：支持按名称搜索和按类型过滤
 * - 状态监控：实时监控设备状态变化
 * - 事件处理：处理设备操作事件并转发给主界面
 * - 布局管理：自动调整设备卡片的布局和显示
 * 
 * @note 与数据库层直接交互，获取最新的设备信息
 * @warning 需要定期刷新以保持设备状态同步
 * @see DeviceCard, UAVDatabase, DogDatabase
 * @since 1.0
 */
class DeviceListPanel : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针，默认为nullptr
     */
    explicit DeviceListPanel(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~DeviceListPanel();
    
    /**
     * @brief 获取当前设备数量
     * @return 设备总数
     */
    int getDeviceCount() const { return m_deviceCards.size(); }
    
    /**
     * @brief 获取当前选中的设备ID
     * @return 选中的设备ID，如果没有选中则返回空字符串
     */
    QString getSelectedDeviceId() const;
    
    /**
     * @brief 获取指定类型的设备数量
     * @param type 设备类型
     * @return 指定类型的设备数量
     */
    int getDeviceCountByType(const QString &type) const;
    
    /**
     * @brief 获取在线设备数量
     * @return 在线设备数量
     */
    int getOnlineDeviceCount() const;

public slots:
    /**
     * @brief 刷新设备列表
     * 
     * 从数据库重新加载所有设备信息并更新显示
     */
    void refreshDeviceList();
    
    /**
     * @brief 添加新设备
     * @param device 设备信息
     */
    void addDevice(const DeviceInfo &device);
    
    /**
     * @brief 移除设备
     * @param deviceId 设备ID
     */
    void removeDevice(const QString &deviceId);
    
    /**
     * @brief 更新设备信息
     * @param device 更新的设备信息
     */
    void updateDevice(const DeviceInfo &device);
    
    /**
     * @brief 更新设备状态
     * @param deviceId 设备ID
     * @param status 新状态
     */
    void updateDeviceStatus(const QString &deviceId, DeviceStatus status);
    
    /**
     * @brief 设置搜索关键词
     * @param keyword 搜索关键词
     */
    void setSearchKeyword(const QString &keyword);
    
    /**
     * @brief 设置过滤类型
     * @param filterType 过滤类型
     */
    void setFilterType(DeviceFilterType filterType);
    
    /**
     * @brief 选择指定设备
     * @param deviceId 设备ID
     */
    void selectDevice(const QString &deviceId);
    
    /**
     * @brief 清除设备选择
     */
    void clearSelection();
    
    /**
     * @brief 启动状态监控
     */
    void startStatusMonitoring();
    
    /**
     * @brief 停止状态监控
     */
    void stopStatusMonitoring();

    /**
     * @brief 更新设备列表显示
     */
    void updateDeviceListDisplay();
    
    /**
     * @brief 更新设备计数显示
     */
    void updateDeviceCount();
    
    /**
     * @brief 应用设备过滤
     */
    void applyDeviceFilter();

signals:
    /**
     * @brief 设备被选中信号
     * @param deviceId 设备ID
     */
    void deviceSelected(const QString &deviceId);
    
    /**
     * @brief 设备控制请求信号
     * @param deviceId 设备ID
     */
    void deviceControlRequested(const QString &deviceId);
    
    /**
     * @brief 设备定位请求信号
     * @param deviceId 设备ID
     */
    void deviceLocationRequested(const QString &deviceId);
    
    /**
     * @brief 设备详情请求信号
     * @param deviceId 设备ID
     */
    void deviceDetailsRequested(const QString &deviceId);
    
    /**
     * @brief 添加设备请求信号
     * @param deviceType 设备类型 ("uav" 或 "dog")
     */
    void addDeviceRequested(const QString &deviceType);
    
    /**
     * @brief 设备数量变化信号
     * @param totalCount 总设备数
     * @param onlineCount 在线设备数
     */
    void deviceCountChanged(int totalCount, int onlineCount);

private slots:
    // 搜索相关槽函数已删除
    
    /**
     * @brief 添加UAV按钮点击槽函数
     */
    void onAddUAVClicked();
    
    /**
     * @brief 添加机器狗按钮点击槽函数
     */
    void onAddDogClicked();
    
    /**
     * @brief 删除设备按钮点击槽函数
     */
    void onDeleteDeviceClicked();
    
    /**
     * @brief 设备卡片选中槽函数
     * @param deviceId 设备ID
     */
    void onDeviceCardSelected(const QString &deviceId);
    
    /**
     * @brief 设备卡片控制请求槽函数
     * @param deviceId 设备ID
     */
    void onDeviceCardControlRequested(const QString &deviceId);
    
    /**
     * @brief 设备卡片定位请求槽函数
     * @param deviceId 设备ID
     */
    void onDeviceCardLocationRequested(const QString &deviceId);
    
    /**
     * @brief 设备卡片详情请求槽函数
     * @param deviceId 设备ID
     */
    void onDeviceCardDetailsRequested(const QString &deviceId);
    
    /**
     * @brief 设备状态变化槽函数
     * @param deviceId 设备ID
     * @param status 新状态
     */
    void onDeviceStatusChanged(const QString &deviceId, DeviceStatus status);
    
    /**
     * @brief 状态监控定时器槽函数
     */
    void onStatusMonitorTimer();

private:
    /**
     * @brief 初始化UI界面
     */
    void setupUI();
    
    /**
     * @brief 连接信号和槽
     */
    void connectSignals();
    
    /**
     * @brief 设置样式
     */
    void setupStyle();
    
    /**
     * @brief 创建设备卡片
     * @param device 设备信息
     * @return 创建的设备卡片指针
     */
    DeviceCard* createDeviceCard(const DeviceInfo &device);
    
    /**
     * @brief 从数据库加载设备列表
     * @return 设备信息列表
     */
    QList<DeviceInfo> loadDevicesFromDatabase();
    
    /**
     * @brief 从数据库删除设备
     * @param deviceId 设备ID
     * @return 是否删除成功
     */
    bool deleteDeviceFromDatabase(const QString &deviceId);
    
    /**
     * @brief 应用搜索和过滤
     */
    void applySearchAndFilter();
    
    /**
     * @brief 检查设备是否匹配过滤条件
     * @param device 设备信息
     * @return 是否匹配
     */
    bool isDeviceMatchFilter(const DeviceInfo &device) const;
    
    /**
     * @brief 更新设备数量统计
     */
    void updateDeviceCountStats();
    
    /**
     * @brief 重新布局设备卡片
     */
    void relayoutDeviceCards();
    
    /**
     * @brief 清除所有设备卡片
     */
    void clearAllDeviceCards();

private:
    // UI组件 - 头部区域
    QLabel *m_titleLabel;                       ///< 面板标题
    QLabel *m_deviceCountLabel;                 ///< 设备数量标签
    
    // UI组件 - 操作按钮
    QPushButton *m_addUAVButton;                ///< 添加无人机按钮
    QPushButton *m_addDogButton;                ///< 添加机器狗按钮
    QPushButton *m_deleteDeviceButton;          ///< 删除设备按钮
    QPushButton *m_refreshButton;               ///< 刷新按钮
    
    // UI组件 - 设备列表区域
    QScrollArea *m_scrollArea;                  ///< 滚动区域
    QWidget *m_scrollWidget;                    ///< 滚动内容窗口
    QVBoxLayout *m_deviceListLayout;            ///< 设备列表布局
    
    // 布局管理器
    QVBoxLayout *m_mainLayout;                  ///< 主布局
    QHBoxLayout *m_headerLayout;                ///< 头部布局
    QHBoxLayout *m_buttonLayout;                ///< 按钮区域布局
    
    // 数据管理
    QHash<QString, DeviceCard*> m_deviceCards; ///< 设备卡片映射表
    QList<DeviceInfo> m_allDevices;             ///< 所有设备信息
    QString m_currentSearchKeyword;             ///< 当前搜索关键词
    DeviceFilterType m_currentFilterType;      ///< 当前过滤类型
    QString m_selectedDeviceId;                 ///< 当前选中的设备ID
    
    // 状态监控
    QTimer *m_statusMonitorTimer;               ///< 状态监控定时器
    bool m_isMonitoringActive;                  ///< 是否启用状态监控
    
    // 数据库接口
    UAVDatabase *m_uavDatabase;                 ///< UAV数据库接口
    DogDatabase *m_dogDatabase;                 ///< 机器狗数据库接口
    
    // 统计信息
    int m_totalDeviceCount;                     ///< 总设备数
    int m_onlineDeviceCount;                    ///< 在线设备数
    int m_uavCount;                             ///< 无人机数量
    int m_dogCount;                             ///< 机器狗数量
    
    // 常量定义
    static const int STATUS_MONITOR_INTERVAL = 5000;   ///< 状态监控间隔（毫秒）
    static const int CARD_SPACING = 6;                  ///< 卡片间距
    static const int PANEL_PADDING = 10;                ///< 面板内边距
};

#endif // DEVICELISTPANEL_H