#ifndef INTERACTIVEDATA_H
#define INTERACTIVEDATA_H

#include <QMap>
#include <QList>
#include <QVector>
#include <QString>

#include <QReadWriteLock>
#include <QReadLocker>
#include <QWriteLocker>

#include "template_singleton.h"
#include "DataListModel.h"

#define MATERIALS_TYPE_ALL "0"

class InteractiveData : public QObject
{
    SINGLETON_DEFINE(InteractiveData)       // 定义为单例类
    Q_OBJECT

    Q_PROPERTY(QSet<QString> roles READ roles WRITE setRoles NOTIFY rolesChanged)
    Q_PROPERTY(QSet<QString> permissions READ permissions WRITE setPermissions NOTIFY permissionsChanged)


signals:
    void rolesChanged();
    void permissionsChanged();

public:

    Q_INVOKABLE bool isHavePower(const QString &operation);

    QSet<QString> roles();
    void setRoles(const QSet<QString> &roles);
    QSet<QString> permissions();
    void setPermissions(const QSet<QString> &permissions);

private:
    explicit InteractiveData();

public:
    QReadWriteLock m_dataCacheLock;         // 数据缓存锁

    int m_checkPlanStatus = -1;             // 当前物资柜检查计划ID

    QString m_token;                        // token存储
    QString m_cabinetId;                    // 物资柜ID

    QString m_userName;                     // 用户名
    QSet<QString> m_roles;                  // 用户角色
    QSet<QString> m_permissions;            // 用户许可


    // 用于http返回重复消息性能优化的json临时存储
    QByteArray m_jsonCacheExceptionTypeDict;     // 异常类型字典缓存Json
    QByteArray m_jsonCacheSeverityLevelDict;     // 严重程度字典缓存Json

    QByteArray m_jsonCacheMaterialProp;     // 物资属性数据缓存Json
    QByteArray m_jsonCacheMaterialType;     // 物资类型数据缓存Json
    QByteArray m_jsonCacheMaterialInfo;     // 物资信息数据缓存Json
    QByteArray m_jsonCacheExMaterialInfo;   // 异常物资数据缓存Json
    QByteArray m_jsonCacheMaterialsLoanExceptionInfo;   // 物资借出异常缓存Json


    // 数据缓存列表


    // 异常类型字典值
    QList<QString> m_dataCacheExceptionTypeDictCode;            // 异常类型字典 Code 列表
    QHash<QString, QString> m_dataCacheExceptionTypeDictLabel;  // 异常类型字典 Code Label 绑定关系
    QHash<QString, QString> m_dataCacheExceptionTypeDictValue;  // 异常类型字典 Code Value 绑定关系

    // 严重程度字典值
    QList<QString> m_dataCacheSeverityLevelDictCode;            // 严重程度字典 Code 列表
    QHash<QString, QString> m_dataCacheSeverityLevelDictLabel;  // 严重程度字典 Code Label 绑定关系
    QHash<QString, QString> m_dataCacheSeverityLevelDictValue;  // 严重程度字典 Code Value 绑定关系

    // 物资属性
    QList<QString> m_dataCacheMaterialPropId;                   // 物资属性 ID 列表
    QHash<QString, QString> m_dataCacheMaterialPropName;        // 物资属性 ID Name 绑定关系
    QHash<QString, QString> m_dataCacheMaterialPropPropertyId;  // 物资属性 ID 属性项ID 绑定关系
    QHash<QString, QString> m_dataCacheMaterialPropPropertyName;// 物资属性 ID 属性项名称 绑定关系


    // 物资类型
    QList<QString> m_dataCacheMaterialTypeId;                   // 物资类型 ID 列表
    QHash<QString, QString> m_dataCacheMaterialTypeName;        // 物资类型 ID 名称 绑定关系
    QHash<QString, QString> m_dataCacheMaterialTypeIcon;        // 物资类型 ID 图标 绑定关系
    QHash<QString, QString> m_dataCacheMaterialTypePicture;     // 物资类型 ID 图片 绑定关系
    QHash<QString, QStringList> m_dataCacheMaterialTypeAncestors;       // 物资类型 ID 上层属性 绑定关系
    QHash<QString, QStringList> m_dataCacheMaterialTypePropertyIds;     // 物资类型 ID 属性项ids 绑定关系


    // 物资信息
    QList<QString> m_dataCacheMaterialInfoId;                   // 物资信息 ID 列表
    QHash<QString, QString> m_dataCacheMaterialInfoName;        // 物资信息 ID 名称 绑定关系
    QHash<QString, QString> m_dataCacheMaterialInfoRfid;        // 物资信息 ID rfid 绑定关系

    QHash<QString, QString> m_dataCacheMaterialInfoLoan;        // 物资信息 ID 借出状态 绑定关系
    QHash<QString, QString> m_dataCacheMaterialInfoStat;        // 物资信息 ID 异常状态 绑定关系
    QHash<QString, QString> m_dataCacheMaterialInfoDate;        // 物资信息 ID 过期时间 绑定关系

    QHash<QString, QString> m_dataCacheMaterialInfoTypeId;      // 物资信息 ID 类型ID 绑定关系
    QHash<QString, QString> m_dataCacheMaterialInfoPropId;      // 物资信息 ID 属性ID 绑定关系
    QHash<QString, QString> m_dataCacheMaterialInfoCabinetId;   // 物资信息 ID 机柜ID 绑定关系


    // 异常信息类型
    QList<QString> m_dataCacheExMaterialTypeId;                 // 物资类型 ID 列表
    QHash<QString, int> m_dataCacheExMaterialTypeExNumber;      // 物资异常类型数量绑定关系

    // 异常信息处理
    QList<QString> m_dataCacheExMaterialInfoId;                 // 异常物资信息 ID 列表
    QHash<QString, QString> m_dataCacheExMaterialInfoName;      // 异常物资信息 ID 名称 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoRfid;      // 异常物资信息 ID rfid 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoLoan;      // 异常物资信息 ID 借出状态 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoStat;      // 异常物资信息 ID 状态 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoDate;      // 异常物资信息 ID 过期时间 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoTypeId;    // 异常物资信息 ID 类型ID 绑定关系
    QHash<QString, QString> m_dataCacheExMaterialInfoPropId;    // 异常物资信息 ID 属性ID 绑定关系


    // 错放物资信息
    QList<QString> m_dataCacheMaterialLoadRfid;                   // 错放物资信息 RFID 列表
    QHash<QString, QString> m_dataCacheMaterialLoanName;          // 错放物资信息 RFID 名称 绑定关系
    // QHash<QString, QString> m_dataCacheMaterialLoanRfid;          // 错放物资信息 RFID rfid 绑定关系
    QHash<QString, QString> m_dataCacheMaterialLoanTypeIcon;      // 错放物资信息 RFID 类型图标 绑定关系
    QHash<QString, QString> m_dataCacheMaterialLoanTypePicture;   // 错放物资信息 RFID 类型图片 绑定关系



    // 本柜子的物资


    // 用于qml显示的model

    DataListModel m_modelMaterialType;           // 物资类型 model
    DataListModel m_modelMaterialInfo;           // 物资信息 model
    DataListModel m_modelMaterialManualReplace;  // 手动更换 model

    DataListModel m_modelMaterialException;      // 物资异常 Model

    DataListModel m_modelMaterialDissolve;      // 物资解除错放 model
    DataListModel m_modelMaterialMisplace;      // 物资错放异常 model

    DataListModel m_modelMaterialBinded;        // 物资绑定 model
    DataListModel m_modelMaterialUnbind;        // 物资解绑 model

    DataListModel m_modelMaterialTake;          // 物资领取 model
    DataListModel m_modelMaterialBack;          // 物资归还 model

};

#endif // INTERACTIVEDATA_H
