#ifndef RETURNKEYLOCKMANAGER_H
#define RETURNKEYLOCKMANAGER_H

#include <QTimer>
#include <QMutex>
#include <QSet>
#include <QQueue>
#include <QVariantMap>
#include <QVariantList>
#include <QtQml/qqml.h>

#include "../httpclient/HttpClient.h"
#include "../httpclient/HttpGetWorkNodeDetail.h"

struct BLERWorkTicketResult;

/**
 * @brief 归还设备信息结构
 */
struct ReturnDeviceInfo {
    QString nfcId;              // NFC卡号
    QString deviceType;         // 设备类型: "key" 或 "lock"
    int slotIndex;              // 插槽索引 (钥匙: 0=左, 1=右; 锁: 0-4)
    QString status;             // 状态: "pending", "success", "failed", "error"
    QString statusMessage;      // 状态描述
    QString taskId;             // 所属作业任务ID
    QString taskName;           // 作业任务名称
    QString taskOrderNo;        // 工单号
    QString taskWorker;         // 负责人
    QString returnTime;         // 归还时间
    bool hasTask;               // 是否有关联作业任务
    bool isDeviceError;         // 是否设备异常（无法读取NFC）
};

typedef struct {
    QString taskCode;
    QString keyNfc;
    QList<QString> lockNfcs;
} CurrentKeyAndLocks;

/**
 * @brief 归还钥匙和锁管理器
 * 
 * 功能：
 * 1. 监听CAN通讯，接收NFC卡号
 * 2. NFC卡号去重并存入队列
 * 3. 逐个调用API获取设备状态
 * 4. 按作业任务分类设备
 * 5. 提供统计数据
 */
class ReturnKeyLockManager : public QObject
{
    Q_OBJECT
    QML_SINGLETON
    QML_NAMED_ELEMENT(ReturnKeyLockManager)

    // QML属性
    Q_PROPERTY(bool isProcessing READ isProcessing WRITE setIsProcessing NOTIFY isProcessingChanged)
    Q_PROPERTY(bool isVisible READ isVisible WRITE setIsVisible NOTIFY isVisibleChanged)
    Q_PROPERTY(int totalTasks READ totalTasks NOTIFY statisticsChanged)
    Q_PROPERTY(int totalKeys READ totalKeys NOTIFY statisticsChanged)
    Q_PROPERTY(int successKeys READ successKeys NOTIFY statisticsChanged)
    Q_PROPERTY(int failedKeys READ failedKeys NOTIFY statisticsChanged)
    Q_PROPERTY(int totalLocks READ totalLocks NOTIFY statisticsChanged)
    Q_PROPERTY(int successLocks READ successLocks NOTIFY statisticsChanged)
    Q_PROPERTY(int failedLocks READ failedLocks NOTIFY statisticsChanged)
    Q_PROPERTY(int confirmCountdown READ confirmCountdown NOTIFY confirmCountdownChanged)
    Q_PROPERTY(QString currentReadingStatus READ currentReadingStatus NOTIFY currentReadingStatusChanged)

public:
    static ReturnKeyLockManager* instance();
    static ReturnKeyLockManager* create(QQmlEngine*, QJSEngine*);
    ~ReturnKeyLockManager();

    // 属性访问器
    bool isProcessing() const { return m_isProcessing; }
    void setIsProcessing(bool okProcess) {
        m_isProcessing = okProcess;
        emit isProcessingChanged();
    }
    bool isVisible() const { return m_isVisible; }
    void setIsVisible(bool visible);
    
    int totalTasks() const { return m_taskGroups.count(); }
    int totalKeys() const { return m_totalKeys; }
    int successKeys() const { return m_successKeys; }
    int failedKeys() const { return m_failedKeys; }
    int totalLocks() const { return m_totalLocks; }
    int successLocks() const { return m_successLocks; }
    int failedLocks() const { return m_failedLocks; }
    int confirmCountdown() const { return m_confirmCountdown; }
    QString currentReadingStatus() const { return m_currentReadingStatus; }

public slots:
    /**
     * @brief 接收CAN发送的NFC卡号（由CANClient调用）
     * @param nfcId NFC卡号
     * @param deviceType 设备类型 "key" 或 "lock"
     * @param slotIndex 插槽索引
     */
    void onNfcDetected(const QString& nfcId, const QString& deviceType, int slotIndex);

    /**
     * @brief 接收设备异常信号（无法读取NFC）
     * @param deviceType 设备类型
     * @param slotIndex 插槽索引
     */
    void onDeviceError(const QString& deviceType, int slotIndex);

    /**
     * @brief API响应处理（由HttpClient调用）
     * @param nfcId NFC卡号
     * @param success 是否成功
     * @param data 返回数据
     */
    void onApiResponse(const QString& nfcId, bool success, const QVariantMap& data);

    void slotReceivedJobTicket(const BLERWorkTicketResult &result);

    /**
     * @brief 确认归还
     */
    Q_INVOKABLE void confirmReturn();

    /**
     * @brief 取出归还失败的设备
     */
    Q_INVOKABLE void retrieveFailedDevices();

    /**
     * @brief 清空所有数据并关闭页面
     */
    Q_INVOKABLE void closePage();

    /**
     * @brief 获取按作业任务分组的数据（供QML使用）
     */
    Q_INVOKABLE QVariantList getTaskGroups();

    /**
     * @brief 获取设备异常列表（供QML使用）
     */
    Q_INVOKABLE QVariantList getErrorDevices();

    /**
     * @brief 获取无作业任务列表（供QML使用）
     */
    Q_INVOKABLE QVariantList getNoTaskDevices();

    /**
     * @brief 测试触发（用于开发调试）
     * @param deviceType 设备类型 "key" 或 "lock"
     * @param slotIndex 插槽索引
     */
    Q_INVOKABLE void testTrigger(const QString& deviceType = "key", int slotIndex = 0);

    void slotGetJobTicketResult(int stat, const QJsonObject& dataObj);
public:
    Q_INVOKABLE void startConfirmCountdown();
    Q_INVOKABLE void stopConfirmCountdown();
signals:
    void isProcessingChanged();
    void isVisibleChanged();
    void statisticsChanged();
    void confirmCountdownChanged();
    void currentReadingStatusChanged();
    
    // 请求显示页面（CAN检测到设备插入时发出）
    void requestShowPage();
    
    // 数据更新信号（通知QML刷新界面）
    void dataUpdated();
    
    // API请求信号（连接到HttpClient）
    void signalQueryDeviceStatus(quint64 id, const QString& url, const QByteArray& data, const QString& token);
private slots:
    void processNextInQueue();
    void onConfirmCountdownTick();

private:
    explicit ReturnKeyLockManager(QObject* parent = nullptr);
    
    void updateStatistics();

    QString getCurrentTimeString();
private:
    static ReturnKeyLockManager* m_instance;
    
    QMutex m_mutex;
    QSet<QString> m_nfcIdSet;                   // NFC去重集合
    QQueue<ReturnDeviceInfo> m_pendingQueue;    // 待处理队列
    QMap<QString, ReturnDeviceInfo> m_deviceMap;// 所有设备信息 (key=nfcId)
    
    // 按作业任务分组 (key=taskId, value=设备列表)
    QMap<QString, QList<ReturnDeviceInfo>> m_taskGroups;
    QList<ReturnDeviceInfo> m_errorDevices;     // 设备异常列表
    QList<ReturnDeviceInfo> m_noTaskDevices;    // 无作业任务列表
    
    bool m_isProcessing;
    bool m_isVisible;
    QString m_currentReadingStatus;
    
    // 统计数据
    int m_totalKeys;
    int m_successKeys;
    int m_failedKeys;
    int m_totalLocks;
    int m_successLocks;
    int m_failedLocks;
    
    // 确认倒计时
    int m_confirmCountdown;
    QTimer* m_confirmTimer;
    QTimer* m_processTimer;

    // 记录当前搜索的钥匙
    CurrentKeyAndLocks m_currTask;
    HttpGetWorkNodeDetail* m_workDetail;
    HttpClient* m_httpClient;
};

#endif // RETURNKEYLOCKMANAGER_H
