#include "addapp.h"
#include <QFileDialog>
#include <QProcessEnvironment>
#include <QMessageBox>
#include <sqlitehelper.h>
#include "config.h"
#include "applicationmanager.h"


#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;


AddApp::AddApp(bool isEdit, Record2 *row , QWidget* parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	this->row=row;
	SQLiteHelper sqlite_helper;
	setFixedSize(450, 600);
	Record2 record;
	setWindowFlags(Qt::WindowCloseButtonHint);
	form = new QFormLayout;
	name = new QLineEdit;
	if(isEdit)
	{
		record=*row;//最初为啥这么写我也忘了
	}
	
	if (record.orig_name.isEmpty())
	{
		path = new QPushButton(QString::fromLocal8Bit("浏览"));
		connect(path, &QPushButton::clicked, this, &AddApp::broswer_exe);
		form->addRow(QString::fromLocal8Bit("路径"), path);
		if (isEdit)
		{
			sqlite_helper.get_a_software(row->orig_name, &record);
			name_label = new QLabel(orig_name_str);
			form->addRow(QString::fromLocal8Bit("全名"), name_label);
			if (!record.orig_name.isEmpty())
			{
				name_label->setText(record.orig_name);
			}
			orig_name_str = record.orig_name;
		}
		else
		{
			orig_name = new QLineEdit;
			form->addRow(QString::fromLocal8Bit("全名"), orig_name);
		}
		form->addRow(QString::fromLocal8Bit("名称"), name);

		sort = new QLineEdit;
		sort->setValidator(new QIntValidator(10, 100));
		sort->setText("50");
		form->addRow(QString::fromLocal8Bit("排序"), sort);
		QList<Categrory> categrories;
		layout_inner = new QVBoxLayout;
		sqlite_helper.get_category(categrories, true);

		for (auto category : categrories)
		{
			QCheckBox* check_box = new QCheckBox(category.name);

			layout_inner->addWidget(check_box);
			categories_list.insert(category.id, check_box);
		}
		form->addRow(QString::fromLocal8Bit("类别"), layout_inner);
		submit_btn = new QPushButton(QString::fromLocal8Bit("提交"));
		form->addWidget(submit_btn);
		this->setLayout(form);
		connect(path, &QPushButton::click, this, &AddApp::broswer_exe);
		connect(submit_btn, &QPushButton::clicked, this, &AddApp::submit);
		this->isEdit = isEdit;
	}
	else
	{
		name->setText(record.name);
		name_str = record.name;
		sort_str = QString::number(record.sort);
		path = new QPushButton(QString::fromLocal8Bit("浏览"));
		path_str = record.exe_file;
		path->setText(QString::fromWCharArray(fs::path(path_str.toStdWString()).filename().c_str()));
		connect(path, &QPushButton::clicked, this, &AddApp::broswer_exe);
		if (record.op == "soft")
		{
			form->addRow(QString::fromLocal8Bit("路径"), path);
		}
		if (isEdit)
		{
			sqlite_helper.get_a_software(row->orig_name, &record);
			name_label = new QLabel(orig_name_str);
			form->addRow(QString::fromLocal8Bit("全名"), name_label);
			if (!record.orig_name.isEmpty())
			{
				name_label->setText(record.orig_name);
			}
			orig_name_str = record.orig_name;
		}
		else
		{
			orig_name = new QLineEdit;
			form->addRow(QString::fromLocal8Bit("全名"), orig_name);
		}
		form->addRow(QString::fromLocal8Bit("名称"), name);

		sort = new QLineEdit;
		sort->setText(QString::number(record.sort));
		sort->setValidator(new QIntValidator(10, 100));
		form->addRow(QString::fromLocal8Bit("排序"), sort);
		QList<Categrory> categrories;
		layout_inner = new QVBoxLayout;
		sqlite_helper.get_category(categrories, true);
		this->categories = record.categories;
		for (auto category : categrories)
		{
			QCheckBox* check_box = new QCheckBox(category.name);
			if (record.categories[category.id - 1])
			{
				check_box->setCheckState(Qt::Checked);
			}
			layout_inner->addWidget(check_box);
			categories_list.insert(category.id, check_box);
		}
		form->addRow(QString::fromLocal8Bit("类别"), layout_inner);
		submit_btn = new QPushButton(QString::fromLocal8Bit("提交"));
		form->addWidget(submit_btn);
		this->setLayout(form);
		connect(path, &QPushButton::click, this, &AddApp::broswer_exe);
		connect(submit_btn, &QPushButton::clicked, this, &AddApp::submit);
		this->isEdit = isEdit;
	}
}

AddApp::~AddApp()
{
	//delete categories;
	delete name;
	if(isEdit)
	{
		delete name_label;
	}else
	{
		delete orig_name;
	}
	delete path;
	//delete sort;
	delete submit_btn;
	delete form;
}

void AddApp::broswer_exe(){
	QString path_str_old = path_str;
	if(path_str.isEmpty())
	{
		path_str = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("选择程序"),
			QApplication::applicationDirPath(), QString::fromLocal8Bit("应用程序 (*.exe)"));
	}
	else
	{
		path_str = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("选择程序"),
			path_str, QString::fromLocal8Bit("应用程序 (*.exe)"));
	}
	if (path_str.isEmpty()) {
		path_str = path_str_old;
	}
	fs::path file(path_str.toStdWString());
	path->setText(QString::fromStdWString(file.filename().c_str()));
	if(!isEdit)
	{
		orig_name->setText(QString::fromStdWString(file.filename().c_str()));
	}
}

void AddApp::submit() {
	if(sort->text().toInt()<10||sort->text().toInt()>100)
	{
		QMessageBox::critical(this, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("排序必须在10-100之间"));
		return;
	}
	if (isEdit)
	{
		QString name_str_old = name_str;
		QString sort_str_old = sort_str;
		name_str = name->text();
		sort_str = sort->text();
		if (name_str.isEmpty()) {
			name_str = name_str_old;
		}
		if (sort_str.isEmpty()) {
			sort_str = sort_str_old;
		}
	}
	else
	{
		if ((!orig_name->text().isEmpty()) && (!path->text().isEmpty()))
		{
			orig_name_str = orig_name->text();
			if (name->text().isEmpty()) {
				name_str = orig_name_str;
			}
			else {
				name_str = name->text();
			}
			
			sort_str = sort->text();
		}
		else
		{
			QMessageBox::critical(this, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("未填写全名或路径"));
			return;
		}
	}
	categories = new bool[8];
	for (int i = 0; i < CATEGORIES_NUM; i++) {
		categories[i] = false;
	}
	categories[ALL-1] = true;
	for(auto key:categories_list.keys())
	{
		categories[key - 1] = categories_list[key]->checkState();
	}
	
	for (int i = 0; i < CATEGORIES_NUM; i++) {
		qDebug() << categories[i];
	}
	
	changed = true;
	close();
}
