//
// Created by HW on 2023/07/27.
//

#ifndef OFFICEASSISTANT_NETIO_H
#define OFFICEASSISTANT_NETIO_H
#include <QString>
#include <QFile>
#include <QMessageBox>
#include <cstring>
#include <QJsonDocument>
#include <QJsonObject>
#include <Windows.h>
#include <QtNetwork/QtNetwork>
#include "buttonstruct.h"
#include "sqlitehelper.h"

typedef struct {
    QString img;
    QString png;
    QString img_name;
    QString name;
    QString type;
    int sort;
    int status;
    bool is_navbar;
    bool is_elite;
    QString orig_name;
    QString categroy_id;
    QString op;
    QString func;
    QString url;
    QString dev;
    bool locked;
    bool is_delete;
    QString version;

} Button;
struct ConfigResponse {
    bool succeed;
    struct {
        QString logo_url;
        QString device_id;
        QString dev_id;
        QString token;
        QString backgroud_color;
        QString title_color;
        QString title_cover_color;
    }basic;
    QList<Button> buttons;
};

class RequestBodyBase:public QObject{
	Q_OBJECT;
public:
    RequestBodyBase();
    virtual void sendRequest();
protected:
    QString product;
    QString parter_id;
    QString os;
    QString os_version;
    QString device_id;
    QString request_id;
    QString version;
    QString release;
    QString sign;
    QJsonDocument qJsonDocument;
	QNetworkReply *reply;
	QEventLoop eventLoop;
	QTimer *timer;
    bool downloadSuccess = true;
protected slots:
	void cancelDownload();
};
class ConfigRequest:public RequestBodyBase{
public:
    ConfigRequest():RequestBodyBase(){}
    void sendRequest(ConfigResponse * configResponse);
};
class OpRequest:public RequestBodyBase{
public:
    OpRequest(QString Op,QString OpValue):RequestBodyBase(),op(Op),op_value(OpValue){
        QJsonObject obj_root=qJsonDocument.object();
        QJsonValue value=op;
        obj_root.insert("op",op);
        value=op_value;
        obj_root.insert("op_value",op_value);
        qJsonDocument.setObject(obj_root);
    }
    QString getOpValue(){
        return op_value;
    }
    QString getOp(){
        return op;
    }
    void setOpValue(QString op_value){
        this->op_value=op_value;
    }
    void setOp(QString op){
        this->op=op;
    }
    void sendRequest();
protected:
    QString op;
    QString op_value;
};

class DeviceRequest:RequestBodyBase{
public:
    DeviceRequest();
};

class OpenMulitiWechat:public RequestBodyBase{
public:
    OpenMulitiWechat(): RequestBodyBase(){}
};
inline QString getMachineGUID() {
	HKEY hKey;
	RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography",
		0, KEY_READ | KEY_WOW64_64KEY, &hKey);
	DWORD dwType1 = REG_SZ;
	DWORD dwLen = MAX_PATH;
	WCHAR buf[100];
	RegQueryValueExA(hKey, "MachineGuid", 0, &dwType1, (LPBYTE)buf, &dwLen);
	QString guid = QString::fromWCharArray(buf);
	return guid;
}

class SoftwareRequest :public RequestBodyBase {
public:
    SoftwareRequest():RequestBodyBase(){}
    bool sendRequest(QHash<QString, QString>&startMenu, QHash<QString, Record>*records,QJsonArray &software_exists);
};

class OpenWeChatRequest:public RequestBodyBase
{
public:
	OpenWeChatRequest():RequestBodyBase(){}
    QString sendRequest(bool notuse=false/*为了构成函数重载，凑数的*/);
};
#endif //OFFICEASSISTANT_NETIO_H
