#pragma once
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QString>
#include <QObject>
#include <QDate>
#include <QtNetwork/QtNetwork>
#include "buttonstruct.h"
struct ConfigResponse;
class ConfigRequest;
struct Record2;
class SoftwareRequest;
typedef struct tagRecord{
	int id;
	int sort;
	QString initial_position;
	QString app_id;
	bool locked;
	bool is_navbar;
	bool is_elite;
	QString type;
	QString category_id;
	QString logo;
	QString img;
	QString name;
	QString orig_name;
	QString version;
	QString dev;
	time_t create_time;
	time_t use_time;
	QString op;
	QString func;
	QString path;
	QString url;
	bool status;
}Record;
#include "netio.h"
struct Categrory
{
	int id;
	int total;
	QString name;
	bool display;
	int sort;
};
class SQLiteHelper : public QObject
{
	Q_OBJECT

public:
	SQLiteHelper(QObject *parent = nullptr);
	bool update_software();
	bool insert_software(QString name, QString orig_name, QString path, QString sort, bool* categories, QString logo, QString img,QString type,bool locked,QString op,QString func,QString url,bool is_navbar,bool is_elite,QString dev);
	bool insert_software(QString name, QString orig_name, QString path, QString sort, bool* categories);
	bool edit_software(QString name, QString orig_name, QString path, QString sort, bool* categories,QString type="");
	bool get_software(QList<ButtonStruct>* buttons, ConfigResponse* config_response);
	bool get_software(QList<ButtonStruct>* button_structs,QString background_color , QString title_color, QString title_cover_color);
	bool update_app();
	bool get_buttons(QList<ButtonStruct> &buttons);
	bool get_category(QList<Categrory>& categrories, bool is_edit,bool all=false);
	bool set_category(QList<Categrory>& categrories);
	bool get_all_software(QList<Record> &softwares,int category);
	bool get_a_software(QString orig_name, Record2 *record);
	bool update_total();//警告：这个函数必须用于事务中
	bool use_software(QString orig_name);

	QSqlDatabase db;

	~SQLiteHelper();
	
private:
	QNetworkReply* reply;
	QEventLoop eventLoop;
	bool downloadSuccess;
	bool delete_software(QString orig_name);
	bool execute_query(QString sql, QList<Record>& softwares);

	void cancelDownload();
};
