//
// Created by Krad on 2021/10/8.
//
#include "ui_tabformwidget.h"
#include "SelectFormWidget.h"
#include <QHBoxLayout>
#include <QToolButton>
#include <QTableWidget>
#include "components/SlideableTableView.h"
#include <QHeaderView>
#include <QUuid>
#include <QDate>
#include "db/SQLHelper.h"
#include "editpatientform.h"
#include "guimacros.h"
#include "event/EventCenter.h"
#include "AccountFormDialog.h"
#include <QDebug>
#include "log/UserOperationLog.h"
#include <QSortFilterProxyModel>
#include "src/components/VerticalTextToolButton.h"
#include "AlertDialog.h"

#include <QScroller>

#define ADD_CENTER_ITEM(row,col,text)\
    item = new QTableWidgetItem(text);\
    item->setTextAlignment(Qt::AlignmentFlag::AlignCenter);\
    table->setItem(row,col,item);


int queryValue(QSqlTableModel* model, int colID, QVariant var)
{
	for (int i = 0; i < model->rowCount(); ++i) {
		if (model->data(model->index(i, colID)) == var) return i;
	}
	return -1;
}

SelectFormWidget::SelectFormWidget(QWidget* parent) :
	TabFormWidget(parent)
{
	//init command bar
	QHBoxLayout* layout = new QHBoxLayout();
	ui->commandWidget->setLayout(layout);
	ADD_TOOL_BTN(Account, ":/icons/account.png");
	ADD_TOOL_BTN(Worklist, ":/icons/setting.png");
	btnAccount->setText(tr("Account"));
	btnWorklist->setText(tr("Worklist"));

	layout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
	QWidget* spacerLine = new QWidget(this);
	spacerLine->setFixedWidth(2);
	spacerLine->setObjectName("verSpaceLine");
	layout->addWidget(spacerLine);
	ADD_TOOL_BTN(Add, ":/icons/add.png");
	ADD_TOOL_BTN(Edit, ":/icons/details.png");
	ADD_TOOL_BTN(Delete, ":/icons/close_circle.png");
	ADD_TOOL_BTN(Select, ":/icons/selected.png");
	btnAdd->setText(tr("Add"));
	btnEdit->setText(tr("Edit"));
	btnDelete->setText(tr("Delete"));
	btnSelect->setText(tr("Select"));

	//Init content widget
	QHBoxLayout* contentLayout = new QHBoxLayout();
	contentLayout->setContentsMargins(5, 5, 0, 5);
	this->ui->contentWidget->setLayout(contentLayout);
	// TableView for patient
	QTableView* table = new SlideableTableView(this);
	table->setAlternatingRowColors(true);
	table->setSelectionMode(QAbstractItemView::SingleSelection);
	table->setEditTriggers(QAbstractItemView::NoEditTriggers);
	table->setSelectionBehavior(QAbstractItemView::SelectRows);
	table->verticalHeader()->setDefaultSectionSize(38);
	table->horizontalHeader()->setStretchLastSection(true);
	//data from SQLITE
	// 
	//avoid pan comsumed by tableview!
	table->viewport()->ungrabGesture(Qt::PanGesture);

	auto model = SQLHelper::getTable("Patient");
	model->setFilter("Flag=0");
	model->sort(5, Qt::DescendingOrder);
	model->select();
	model->setHeaderData(1, Qt::Horizontal, "ID");
	model->setHeaderData(2, Qt::Horizontal, tr("Name"));
	model->setHeaderData(3, Qt::Horizontal, tr("Birth Date"));
	model->setHeaderData(4, Qt::Horizontal, tr("Gender"));
	model->setHeaderData(5, Qt::Horizontal, tr("Add Date"));
	model->setHeaderData(6, Qt::Horizontal, tr("Comment"));


	QSortFilterProxyModel* proxyModel = new QSortFilterProxyModel(model); // create proxy
	proxyModel->setSourceModel(model);
	table->setSortingEnabled(true); // enable sortingEnabled

	table->setModel((QAbstractItemModel*)model);
	table->hideColumn(0);
	table->hideColumn(7);
	table->show();

	//  table->setSortingEnabled(true);
	table->setColumnWidth(1, 250);
	table->setColumnWidth(2, 250);
	table->setColumnWidth(3, 120);
	table->setColumnWidth(4, 80);
	table->setColumnWidth(5, 250);
	//    table->sortByColumn(5);
	//    table->setSortingEnabled(true);
	contentLayout->addWidget(table);
	QWidget* spacerLine2 = new QWidget(this);
	spacerLine2->setFixedWidth(2);
	spacerLine2->setObjectName("verSpaceLine");
	contentLayout->addWidget(spacerLine2);
	//edit panel
	EditPatientForm* edit_patient = new EditPatientForm(this);
	edit_patient->setObjectName("edit_patient");
	edit_patient->hide();
	contentLayout->addWidget(edit_patient);

	auto* btnShowEdit = new VerticalTextToolButton(this);
	btnShowEdit->setObjectName("showeditBtn");
	btnShowEdit->setIcon(QIcon(":/icons/edit.png"));
	btnShowEdit->setIconSize(QSize(30, 30));
	btnShowEdit->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
	btnShowEdit->setFixedHeight(225);
	//    btnShowEdit->setVerticalText("E\nd\ni\nt\nP\na\nn\ne\nl");
	btnShowEdit->setVerticalText("Patient Detail");
	contentLayout->addWidget(btnShowEdit);
	contentLayout->setAlignment(btnShowEdit, Qt::AlignmentFlag::AlignTop);
	connect(btnShowEdit, &QToolButton::clicked, [=]() {
		edit_patient->show();
		btnShowEdit->hide();
		});
	connect(edit_patient, &EditPatientForm::hideBtnClicked, [=]() {
		edit_patient->hide();
		btnShowEdit->show();
		});

	//select default row 0
	if (model->rowCount() > 0)
	{
		table->selectRow(0);
		currentRow = 0;
		PatientInformation pat;
#define ADD_PATIENT_PROPERTY(val)\
        pat. val = model->data(model->index(currentRow,PatientInformationEnum:: val)).toString();
		EDIT_PATIENT()
#undef ADD_PATIENT_PROPERTY
			edit_patient->setPatientInformation(&pat);
	}
	//events----------------------------------------------------------------------
	//table current row selection changing event
	connect(table, &QTableView::clicked, [=](const QModelIndex& modelIndex) {
		if (currentRow != modelIndex.row())
		{
			currentRow = modelIndex.row();
			PatientInformation pat;
#define ADD_PATIENT_PROPERTY(val)\
            pat. val = model->data(model->index(modelIndex.row(),PatientInformationEnum:: val)).toString();
			EDIT_PATIENT()
#undef ADD_PATIENT_PROPERTY
				edit_patient->setPatientInformation(&pat);
		}
		});

	connect(btnAdd, &QToolButton::clicked, [=]() {
		edit_patient->show();
		btnShowEdit->hide();
		edit_patient->clearPatientInformation();
		edit_patient->setEditEnable(true);
		btnSelect->setEnabled(false);
		});
	connect(btnEdit, &QToolButton::clicked, [=]() {
		edit_patient->show();
		btnShowEdit->hide();
		table->clicked(table->currentIndex());
		edit_patient->setEditEnable(true);
		btnSelect->setEnabled(false);
		});
	connect(edit_patient, &EditPatientForm::editCancel, [=]() {
		btnSelect->setEnabled(true);
		});
	connect(edit_patient, &EditPatientForm::editAccept, [=](PatientInformation* inf, bool& result) {
		int selectedRow = currentRow;
		bool isAdd = inf->PatientUID.isEmpty();
		if (isAdd) {
			int ref_rowid = queryValue(model, 1, inf->ID);
			if (ref_rowid >= 0)
			{
				//非触屏时，如果被选中的行在选中区域外，以下代码可能会出错
				//但是触屏时一般没问题
				qDebug() << ref_rowid;
				table->scrollTo(model->index(ref_rowid, 3));
				table->selectRow(ref_rowid);
				result = false;
				return;
			}
			selectedRow = model->rowCount();
			inf->PatientUID = QUuid::createUuid().toString();
			inf->AddDate = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
			model->insertRow(0);
			selectedRow = 0;
		}
		qDebug() << inf->PatientUID << inf->AddDate;
#define ADD_PATIENT_PROPERTY(val)\
        model->setData(model->index(selectedRow,PatientInformationEnum:: val),inf-> val);
		EDIT_PATIENT()
#undef ADD_PATIENT_PROPERTY
			if (model->submitAll())
			{
				table->selectRow(selectedRow);
				model->selectRow(selectedRow);
			}
			else {
				//TODO:add some error handle logic
			}
		if (isAdd) {
			LOG_USER_OPERATION(AddPatient);
		}
		else
		{
			LOG_USER_OPERATION(ChangePatientInfo);
		}
		btnSelect->setEnabled(true);
		});

	connect(btnDelete, &QToolButton::clicked, [=]() {
		if (currentRow < 0)return;
        AlertDialog dialog(this);
        dialog.setButtonMode(OkAndCancel);
        dialog.setTitle("Confirm");
        dialog.setWindowModality(Qt::WindowModal);
        QString pat_name =  model->index(currentRow, PatientInformationEnum::Name).data().toString();
        dialog.setAlertMessage(QString(tr("Delete Patient \"%1\" ?")).arg(pat_name));
        if (dialog.exec()!=QDialog::Accepted) return;
		model->setData(model->index(currentRow, PatientInformationEnum::Flag), 9);
		//        model->removeRow(currentRow);
		if (model->submitAll())
		{
			model->select();
			if (model->rowCount() > 0)
			{
				table->selectRow(0);
				model->selectRow(0);
				currentRow = 0;
				PatientInformation pat;
#define ADD_PATIENT_PROPERTY(val)\
                pat. val = model->data(model->index(0,PatientInformationEnum:: val)).toString();
				EDIT_PATIENT()
#undef ADD_PATIENT_PROPERTY
					edit_patient->setPatientInformation(&pat);
				LOG_USER_OPERATION(DeletePatient);
			}
			else {
				currentRow = -1;
				edit_patient->editCancel();
				edit_patient->clearPatientInformation();
			}
		}
		else {
			//TODO:error handle
		}


		});

	connect(btnSelect, &QToolButton::clicked, [=]() {
		if (currentRow < 0)return;
		EventCenter::Default()->triggerEvent(GUIEvents::PatientSelected, nullptr, edit_patient->getPatientInformation()->Copy());
		LOG_USER_OPERATION(SelectPatient);
		});

	connect(btnAccount, &QToolButton::clicked, [=]() {
		AccountFormDialog dia(this);
		dia.setWindowModality(Qt::WindowModal);
		dia.exec();
		});
	connect(EventCenter::Default(), &EventCenter::ResponsePreview, [=](QObject* sender, QObject* data) {
		btnSelect->setEnabled(false);
		btnDelete->setEnabled(false);
		btnEdit->setEnabled(false);
		btnAdd->setEnabled(false);
		});
	connect(EventCenter::Default(), &EventCenter::ResponseStop, [=](QObject* sender, QObject* data) {
		btnSelect->setEnabled(true);
		btnDelete->setEnabled(true);
		btnEdit->setEnabled(true);
		btnAdd->setEnabled(true);
		});
	connect(EventCenter::Default(), &EventCenter::ReloadLanguage, [=]() {

		model->setHeaderData(1, Qt::Horizontal, "ID");
		model->setHeaderData(2, Qt::Horizontal, tr("Name"));
		model->setHeaderData(3, Qt::Horizontal, tr("Birth Date"));
		model->setHeaderData(4, Qt::Horizontal, tr("Gender"));
		model->setHeaderData(5, Qt::Horizontal, tr("Add Date"));
		model->setHeaderData(6, Qt::Horizontal, tr("Comment"));

		btnAccount->setText(tr("Account"));
		//btnWorklist->setText(tr("Worklist"));
		btnAdd->setText(tr("Add"));
		btnEdit->setText(tr("Edit"));
		btnDelete->setText(tr("Delete"));
		btnSelect->setText(tr("Select"));
		});

}


SelectFormWidget::~SelectFormWidget()
{

}
