#include "syschartnavigationmgt.h"
#include <QToolBar>
#include <QVBoxLayout>
#include <QDebug>
#include <topcore/topcore.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topenummanager.h>
#include <toputil/t.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <tbaseutil/ttheme.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tresource.h>
#include <tbaseutil/tenumlist.h>
#include <twidget/tmessagebox.h>
#include <twidget/tsplitter.h>
#include <twidget/ttableviewv2.h>
#include <twidget/ttableview.h>
#include <twidget/ttreemodel.h>
#include <twidget/tpagetool.h>
#include <twidget/tuiloader.h>
#include <twidget/tsearchentry.h>
#include <twidget/tdialog.h>
#include <twidget/tcodeedit.h>
#include <twidget/twidget.h>
#include <tchart/tchartwidget.h>
#include <tchart/tchartstore.h>
#include <tchart/tchartaxisnumeric.h>
#include "syschartnavigation.h"

SysChartNavigationMgt::SysChartNavigationMgt(const QString &iModuleName, const QVariantMap &iUrlPars, QWidget *iParent)
    : TopClassAbs(iParent)
{
    this->setLicenseKey("sys_common");
    initModule(iModuleName, iUrlPars);
    initUi();
//    initSpecifiedClass();
    parseParams(iUrlPars);
    refresh();
    refreshActionState();
}

SysChartNavigationMgt::~SysChartNavigationMgt()
{
}

void SysChartNavigationMgt::refresh(bool iResetPageBol)
{
    if (!this->uid().isEmpty()) {
        graphOnly();
        return;
    }
    t::loading(this);
    TSqlSelectorV2 selector = getSqlSelector(iResetPageBol);
    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(dataRes.errText(), "Error");
        return;
    }
    if (mPageTool != nullptr) {
        mPageTool->setRowCount(dataRes.dataCount(), true);
    }
    QVariantList dataList = dataRes.data().toList();
    TopClassHelper::formatTableData(this,&mTableConf,dataList);
    mTableView->loadData(dataList);
    mDetail->setUid("");
    alertOk(ttr("Load data successful!"));
}

QVariantList SysChartNavigationMgt::selectedItems() const
{
    return mTableView->selectedPrimaryKeys();
}

QVariantList SysChartNavigationMgt::selectedDataMaps() const
{
    return mTableView->selectedRowDataMaps();
}

QString SysChartNavigationMgt::specifiedClass()
{
    return mSpecifiedClass;
}

void SysChartNavigationMgt::onSelectionChanged()
{
    QVariantList selectedItems = mTableView->selectedPrimaryKeys();
    QString uid;
    if (!selectedItems.isEmpty()) {
        uid = selectedItems.first().toString();
    }
    if (mDetail->uid() != uid) {
        mDetail->setLastUid(uid);
        if (!mDetail->isDataModified()) {
            mDetail->setUid(uid);
        }
    }
    refreshActionState();
}

void SysChartNavigationMgt::onDetailChanged()
{
    refreshActionState();
}

void SysChartNavigationMgt::onPageChanged()
{
    refresh(false);
}

void SysChartNavigationMgt::initUi()
{
    mBodyWidget = new QWidget(this);
    this->setCentralWidget(mBodyWidget);
    mBodySplitter = new TSplitter(this);
    mBodySplitter->setOrientation(Qt::Horizontal);
    mBodyLayout = new QVBoxLayout(mBodyWidget);
    mBodyLayout->setContentsMargins(0, 0, 0, 0);
    mBodyLayout->setSpacing(0);
    mBodyLayout->addWidget(mBodySplitter);

    mMgtWidget = new QWidget(this);
    QVBoxLayout *mgtLayout = new QVBoxLayout(mMgtWidget);
    mgtLayout->setMargin(0);
    mgtLayout->setSpacing(0);
    // top toolbar
    if (QToolBar *toolbar = qobject_cast<QToolBar*>(uim()->getWidget("MAIN_TOOLBAR"))) {
        mgtLayout->insertWidget(0, toolbar);
        mSearchEntry = qobject_cast<TSearchEntry *>(uim()->getWidget("MAIN_TOOLBAR/SEARCH_ENTRY"));
        if (mSearchEntry != nullptr) {
            connect(mSearchEntry, SIGNAL(search(QString,QVariant)), this, SLOT(refresh()));
        }
    }
    // tableview
    mTableView = new TTableView(this);
    TopClassHelper::parseTableConf0(this,"view",&mTableConf);
    mTableView->setDataKeyList(mTableConf.dataKeys);
    mTableView->setPrimaryKey(mTableConf.primaryKey);
    QVariantList headerItems = mTableConf.horizontalHeaders;
    headerItems.prepend(QVariant());
    mTableView->setHeaderItem(headerItems);
    mTableView->horizontalHeader()->setFixedHeight(40);
    QMenu *popMenu = qobject_cast<QMenu*>(uim()->getWidget("TABLEVIEW_POPUP"));
    if(popMenu) {
        mTableView->setContextMenu(popMenu);
    }
    if (mSearchEntry != nullptr) {
        mSearchEntry->setOptionList(TDataParse::headerItem2searchList(mTableView->headerItem()));
        mSearchEntry->setPlaceholderText(ttr("Search %1"));
    }
    mgtLayout->addWidget(mTableView);
    connect(mTableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(onSelectionChanged()));
    mBodySplitter->addWidget(mMgtWidget);
    // bottom toolbar
    if (QToolBar *toolbar = qobject_cast<QToolBar*>(uim()->getWidget("BOTTOM_TOOLBAR"))) {
        mBodyLayout->addWidget(toolbar, 0);
        mPageTool = qobject_cast<TPageTool *>(uim()->getWidget("BOTTOM_TOOLBAR/PAGE_TOOL"));
        if (mPageTool != nullptr) {
            mPageTool->setPageSizeVisible(true);
            connect(mPageTool, SIGNAL(pageChanged(int,int)), this, SLOT(onPageChanged()));
        }
    }
    // detail
    mDetail = new SysChartNavigation("sys-chart-navigation");
    mBodySplitter->addWidget(mDetail);
    const QStringList factors = config("view_factors","1:1").toString().split(":");
    if(factors.size() == 2) {
        const float f0 = factors[0].toFloat();
        const float f1 = factors[1].toFloat();
        const float total = f0 + f1;
        const int w = width();
        mBodySplitter->setSizes(QList<int>()
                                << static_cast<int>(w*f0/total)
                                << static_cast<int>(w*f1/total));
    }
    connect(mDetail, SIGNAL(windowModifyChanged(bool)),this,SLOT(onDetailChanged()));
}

void SysChartNavigationMgt::initSpecifiedClass()
{
    t::loading(this);
    TSqlSelectorV2 selector;
    selector.setTable("pub_conf");
    selector.setField("text_data");
    selector.setWhere("path", "navigation_specified_class");
    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_VALUE, QVariant::fromValue(selector));
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(dataRes.errText(), "Error");
        return;
    }
    mSpecifiedClass = dataRes.data().toString();
    qDebug()<<"Specified Class: "<<mSpecifiedClass;
}

TSqlSelectorV2 SysChartNavigationMgt::getSqlSelector(bool iResetPageBol)
{
    TSqlSelectorV2 selector;
    if(mTableConf.dbTableName.isEmpty()) {
        selector.setTable("pub_chart_navigation");
    } else {
        selector.setTable(mTableConf.dbTableName);
    }
    selector.setReturnRowCount(true);
    selector.setField(mTableConf.queryFields);
    int pageNumInt = 1;
    int pageSizeInt = -1;
    if (mPageTool != nullptr) {
        if (iResetPageBol) {
            mPageTool->setCurrentPage(1, true);
        }
        pageNumInt = mPageTool->currentPage();
        pageSizeInt = mPageTool->pageSize();
    }
    if (!mSpecifiedClass.isEmpty()) {
        selector.setWhere("class", mSpecifiedClass);
    }
    if (mSearchEntry != nullptr) {
        selector.whereRef().append(mSearchEntry->sqlWhere());
    }
    selector.setOrder("id", Qt::AscendingOrder);
    if (pageNumInt < 1) {
        pageNumInt = 1;
    }
    if (pageSizeInt < 1) {
        pageSizeInt = 100;
    }
    if (mPageTool != nullptr) {
        selector.setPage(pageNumInt, pageSizeInt);
    }
    return selector;
}

void SysChartNavigationMgt::graphOnly()
{
    mDetail->setUserData("to_detail_data", this->userData("to_detail_data"));
    mDetail->setUid(this->uid());
    QWidget *wid = mBodySplitter->widget(0);
    wid->setVisible(false);
    mDetail->graphOnly(mToolBarMode);
}

void SysChartNavigationMgt::parseParams(const QVariantMap &iParamMap)
{
    QString name = iParamMap.value("name").toString();
    if (!name.isEmpty()) {
        TSqlSelectorV2 selector;
        selector.setTable("pub_chart_navigation");
        selector.setField("id");
        selector.setWhere("name", name);
        QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_VALUE, QVariant::fromValue(selector));
        TDataResponse dataRes(data.toMap());
        if (dataRes.hasError()) {
            alertError(dataRes.errText(), "Error");
            return;
        }
        QString uid = dataRes.data().toString();
        this->setUid(uid);
    }
    mToolBarMode = iParamMap.value("toolbar_mode", 0).toInt();
}