#ifndef PRO_H
#define PRO_H

#include <QObject>
#include <QThread>
#include <QHash>
#include <QTimer>
#include "define.h"
#include "httpclient.h"
#include <QNetworkAccessManager>
#include <QImage>
#include <QCursor>
#include <QTimerEvent>
#include <QSet>
#include <QList>
#include <QString>
#include <QJSValue>
#include <QMouseEvent>

#include "Interactive/InteractiveData.h"
#include "Interactive/InteractiveHttp.h"


enum class proWorkStat {
    usernameLogin,  // 用户登录
    cardLogin,
    fingerLogin,
    faceLogin,
    insertfacelogin,
    userLogout,
    getMaterial,
    userMaterial,
    userMaterial_copy,
    openCabinet,
    closeCabinet,
    upgradeMaterial,

    replaceMaterial,    // 更换物资
    // exceptionHandle,    // 异常处理

    materialTypeGet,    // 获取物资类型
    instructionsGet,    // 获取物资使用说明

    getMaterialCheckPlan,   // 获取物资检查计划
    getMaterialCheckForm,   // 获取物资检查列表

    postSaveForm,   // 保存当前任务表
    postCheckSign,  // 检查签名
    postSubmit,     // 提交最终结果

    getMaterialInfoList,    // 获取物资信息列表

    sleep,
};

class pro : public QThread
{
    Q_OBJECT

public slots:
    void slot_feature_login();

    void slot_set_thread_stop(void);
    void slot_login(int type, QString username, QString password);
    void slot_logout(void);
    void slot_response_data(quint64 id, QString url, QByteArray res);
    void slot_tid_update(quint16 count, QList<QString> tidList);
    void slot_lockStat(bool leftStat, bool rightStat);
    void slot_takebackstat(bool stat);
    void slot_getMaterial(void);
    void slot_saveConfig(void);
    void slot_fingerWork(bool stat);
    void slot_addfinger(bool stat);
    void slot_fingerStat(bool stat, QByteArray img, int size);

    void slot_instructionsGet();
    void slot_pdf_click(QByteArray urlPath);

    void slot_getMaterialCheckPlan();
    void slot_getMaterialCheckForm(int planId);

    void slot_postSaveForm(QString data);

    void slot_postCheckSign(int planId, QString path);

    void slot_postSubmit();

    void slot_getMaterialInfoList();
public:
    explicit pro(QObject *parent = nullptr);

    Q_INVOKABLE void moveCursorTo(int x, int y);

    // 获取物资待归还数量
    Q_INVOKABLE void getSelModelNumber(QJSValue);

    // 是否异常
    Q_INVOKABLE void getError(QJSValue);

    // 获取uuid
    Q_INVOKABLE QString getUuid();

protected:
    bool eventFilter(QObject *obj, QEvent *event) override;


private:
    // QByteArray btyMaterialType; // 物资类型
    // QByteArray btyInstructions; // 物资使用说明
    QNetworkAccessManager *m_pManager;
private:
    bool threadstatus = true;
    QList<QString> tidArray;
    QTimer *timer;
    login_s login;
    proWorkStat workstat = proWorkStat::sleep;
    QString token;
    bool addfingerStat = false;
    bool addfingerFinish = false;
    QByteArray fingerimgbuff;

    // int m_iCurrentPlanId = -1;  // 当前计划ID
    QString m_strPostSaveForm;  // 发送post请求，保存检查表
    QString m_strPostCheckSign; // 发送post请求, 检查签名

    void http_response_usernamelogin(QByteArray data);
    void http_response_cardlogin(QByteArray data);
    void http_response_fingerLogin(QByteArray data);
    void http_response_insertfingerLogin(QByteArray data);
    void http_response_logout(QByteArray data);
    void http_response_getMaterial(QByteArray data);
    void http_response_userMaterial(QByteArray data);
    void http_response_updateMaterial(QByteArray data);     // 物资更换
    void http_response_postMaterialReplaceAuto(QByteArray data); // 物资取还

    void http_response_data(quint64 idx, QString url, QByteArray data);

    void http_response_materialTypeGet(QByteArray data);        // http返回 物资类型
    void http_response_instructionsGet(QByteArray data);        // http返回 使用说明

    void http_response_getMaterialCheckPlan(QByteArray data);   // http返回 物资检查计划
    void http_response_getMaterialCheckForm(QByteArray data);   // http返回 物资检查列表
    void http_response_postSaveForm(QByteArray data);
    void http_response_postCheckSign(QByteArray data);
    void http_response_postSubmit(QByteArray data);
    void http_response_getMaterialInfoList(QByteArray data);

    void http_request_usernamelogin(void);
    void http_request_cardlogin(void);
    void http_request_fingerLogin(void);
    void http_request_insertfingerLogin(void);
    void http_request_userlogout(void);
    void http_request_getMaterial(void);
    void http_request_userMaterial(void);
    void http_request_userMaterial_copy(void);
    void http_request_openCabinet(void);
    void http_request_closeCabinet(void);
    void http_request_updateMaterial(void);
    void http_request_replaceMaterial(void);
    void http_request_exceptionHandle(void);    // 异常处理
    void updateTime(void);


    // 2025-06-03 wxh
    void http_request_materialTypeGet();
    void http_request_instructionsGet();

    void http_request_getMaterialCheckPlan();
    void http_request_getMaterialCheckForm();

    void http_request_postSaveForm();
    void http_request_postCheckSign();
    void http_request_postSubmit();

    void http_request_getMaterialInfoList();

    // 获取不属于这个柜子，但是rfid检测到的物资信息
    void getMaterialElseInfos();
signals:
    void signal_notice_return(win_notice_s notice);
    void signal_login_return_stat(int stat, QString str);
    void signal_login_return_param(QString name, int auth);
    void signal_post_request_data(quint64 id, QString postUrl, QByteArray data, QByteArray file, QString token);
    void signal_get_request_data(quint64 id, QString postUrl, QByteArray data, QString token);
    void signal_updateMaterial(void);
    void signal_updateMaterialHand(void);   // 手动更换
    void signal_updateMaterialAuto(void);   // 自动更换
    void signal_updateMaterialException(void);   // 异常处理
    void signal_updatetakebackMaterial(void);
    void signal_updatetakebackMaterialHand(void);    // 手动更换
    void signal_updatetakebackMaterialAuto(void);    // 自动更换
    void signal_updateExceptionHandle(void);        // 异常处理
    void signal_updatematerialCheckPlan(void);      // 物资检查计划
    // void signal_returnExceptionHandle(bool);    // 物资错放异常处理结果
    void signal_requestertakebackMaterial(void);
    void signal_fingerWork(bool stat);
    void signal_addFinger_act(bool stat);


    void signal_materialTypeGet(QByteArray data);   // 转发至qml, 获取物资类型
    void signal_instructionsGet(QByteArray data);   // 转发至qml, 获取使用说明
    void signal_pdf_relay(QString name);            // 转发至qml, pdf下载完成

    void signal_getMaterialCheckPlan(QByteArray data);  // 转发至qml, 获取物资检查计划
    void signal_getMaterialCheckForm(QByteArray data);  // 转发至qml, 获取物资检查列表

    void signal_postSaveForm(QByteArray data);  // 转发至qml, post结果
    void signal_postCheckSign(QByteArray data); // 转发至qml, post结果
    void signal_postSubmit(QByteArray data);    // 转发至qml, post结果
    void signal_getMaterialInfoList(QByteArray data);   // 转发至qml, 获取物资信息列表

    void signal_lockStatTakeBack(bool, bool);
    void signal_lockStatReplaceHand(bool, bool);
    void signal_lockStatReplaceAuto(bool, bool);
    void signal_lockStatException(bool, bool);
    void signal_lockStatCheckPlan(bool, bool);

    void signal_misplaceRefresh();

    void signal_backRefresh();
    void signal_takeRefresh();

    // 全局鼠标点击
    void signal_global_mouse_clicked();
protected:
    void run() override;
};


#endif // PRO_H
