#include "syscommugroupmgt.h"
#include <QDockWidget>
#include <QGraphicsEffect>
#include <QToolBar>
#include <QVBoxLayout>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tenumlist.h>
#include <tbaseutil/ttheme.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topcore.h>
#include <topcore/topenummanager.h>
#include <toputil/t.h>
#include <twidget/tmessagebar.h>
#include <twidget/tpagetool.h>
#include <twidget/tsearchentry.h>
#include <twidget/tsplitter.h>
#include <twidget/ttableview.h>
#include <twidget/taccordion.h>
#include "syscommugroup.h"
#include "syscommugroupmgtthread.h"

#define ENUM_SYS_COMMU_SEND_MODE "sys-commu-send-mode"

SysCommuGroupMgt::SysCommuGroupMgt(const QString &iModuleNameStr, const QVariantMap &iUrlPars, QWidget *iParent)
    : TopClassAbs(iParent)
{
    this->appendLanguage("sys-commu-group");
    this->setLicenseKey("");
    this->initModule(iModuleNameStr, iUrlPars);

    mBodySplitter = new TSplitter(this);
    QWidget *mBodyWgt = new QWidget(this);
    mBodyWgt->setProperty("SS_BG", "BODY");

    QVBoxLayout *vboxlayout = new QVBoxLayout(mBodyWgt);
    vboxlayout->setMargin(0);
    vboxlayout->setSpacing(0);
    this->setCentralWidget(mBodySplitter);
    mBodyWidget = new TSplitter(this);
    mBodySplitter->addWidget(mBodyWidget);

    QString detailModuleName = config("detailModuleName").toString();
    if (detailModuleName.isEmpty()) {
        detailModuleName = "sys-mail-group";
    }
    mDetailView = new SysCommuGroup(detailModuleName, QVariantMap(), this);
    TopClassHelper::parseTableConf0(this, "view", &mTableConf);
    initTableView();
    initNaviView();

    if (QToolBar *toolbar = qobject_cast<QToolBar*>(uim()->getWidget("MAIN_TOOLBAR"))) {
        vboxlayout->addWidget(toolbar, 0);
    }

    if (QMenu *table_popup = qobject_cast<QMenu *>(uim()->getWidget("TABLEVIEW_POPUP"))) {
        mTableView->setContextMenu(table_popup);
    }

    vboxlayout->addWidget(mTableView, 1);

    if (QToolBar* bToolbar = qobject_cast<QToolBar*>(uim()->getWidget("BOTTOM_TOOLBAR"))){
        vboxlayout->addWidget(bToolbar);
        mPageTool = qobject_cast<TPageTool *>(uim()->getWidget("BOTTOM_TOOLBAR/PAGE_TOOL"));
    }

    mDetailView->resize(TTHEME_DP(config("detail.perfect_size.width", mDetailView->perfectSize().width()).toInt()), mDetailView->height());
    connect(mDetailView, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant)));
    connect(mDetailView, SIGNAL(windowModifyChanged(bool)), SLOT(onDetailChanged()));

    //左侧查询
    TAccordion *accordion = new TAccordion(this);
    accordion->setProperty("SS_BG","NAVI");
    accordion->setMinimumWidth(TTHEME_DP(config("navi.min_size.width", 210).toInt()));
    accordion->setAccordionLocation(TAccordion::AccordionLocation::Left);
    accordion->setIsExpanded(false);
    QVBoxLayout *accordionLayout = new QVBoxLayout(accordion);
    accordionLayout->setMargin(0);
    accordionLayout->setSpacing(0);
    QLabel *naviLabel = new QLabel(ttr("Navigation"));
    naviLabel->setProperty("SS_TYPE", "SUBHEADER");
    accordionLayout->addWidget(naviLabel, 0);
    accordionLayout->addSpacing(TTHEME_DP(4));
    accordionLayout->addWidget(mNaviView,999);
    accordion->setGraphicsEffect(TTHEME->getShadowEffect(1, "left"));
    accordion->expandButton()->setFixedHeight(TTHEME_DP(40));
    accordion->expandButton()->setToolTip(ttr("Display Navigation"));
    accordion->collapseButton()->setToolTip(ttr("Hide Navigation"));
    accordion->setIsExpanded(false);
    mBodyWidget->addWidget(accordion);
    mBodyWidget->addWidget(mBodyWgt);
    mBodySplitter->addWidget(mDetailView);
    mBodySplitter->setStretchFactor(0, 1);
    mBodyWidget->setStretchFactor(1, 2);

    mBodyWidget->setSizes(QList<int>() << TTHEME_DP(config("navi.perfect_size.width", 230).toInt()) << 1);
    mBodySplitter->setSizes(QList<int>() << 1 << TTHEME_DP(config("detail.perfect_size.width", 600).toInt()));

    mSearchEntry = qobject_cast<TSearchEntry *>(uim()->getWidget("MAIN_TOOLBAR/SEARCH_ENTRY"));
    if (mSearchEntry != nullptr) {
        mSearchEntry->setOptionList(TDataParse::headerItem2searchList(mTableView->headerItem()));
        mSearchEntry->setPlaceholderText(ttr("Search %1"));
        connect(mSearchEntry, SIGNAL(search(QString,QVariant)), this, SLOT(refresh()));
        this->setFocusProxy(mSearchEntry);
    }

    if (mPageTool != nullptr) {
        mPageTool->setPageSizeVisible(true);
        connect(mPageTool, SIGNAL(pageChanged(int,int)), this, SLOT(onPageChanged()));
    }

    connect(mTableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
            this, SLOT(onSelectionChanged()));

    if (QAction *openAct = this->getAction("open")) {
        connect(mTableView, SIGNAL(activated(QModelIndex)), openAct, SLOT(trigger()));
    }

    this->restoreSizeState();
    this->restoreObjectState(mTableView);

    refreshActionState();
    mDetailView->setWorkcenterId(this->uid());

    QTimer::singleShot(0, this, SLOT(onNaviDataChanged()));
}

SysCommuGroupMgt::~SysCommuGroupMgt()
{
    this->saveSizeState();
    this->saveObjectState(mTableView);
}

void SysCommuGroupMgt::refresh(bool iResetPageBol)
{
    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(ttr("Load data failed!"), dataRes.errText());
    } else {
        fillTableData(dataRes);
        alertOk(ttr("Data loaded"));
    }
}

void SysCommuGroupMgt::deleteItem(const QVariantList &iIdLst)
{
    loading(ttr("Deleting data..."));
    QVariant data = doThreadWork(new SysCommuGroupMgtThread(this), "DELETE_MAILGROUP", iIdLst);
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(ttr("Delete data failed!"), dataRes.errText());
    } else {
        refresh(true);
        alertOk(ttr("Data deleted"));
    }
}

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

TopClassAbs *SysCommuGroupMgt::openItem(int iIdInt)
{
    QString detailModuleName = "sys-commu-group";
    if (!config("detail_module_name").toString().isEmpty()) {
        detailModuleName = config("detail_module_name").toString();
    }
    SysCommuGroup *detail = qobject_cast<SysCommuGroup *>(APP->openModule(detailModuleName));
    if (detail != nullptr) {
        connect(detail, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant)));
        connect(this, SIGNAL(destroyed()), detail, SLOT(close()));
        detail->setUid(iIdInt);
    }
    return detail;
}

void SysCommuGroupMgt::newItem()
{
    mBodySplitter->cacheSizes();
    mDetailView->create();
    mDetailView->refreshActionState();
}

void SysCommuGroupMgt::onClearNavi()
{
    mFixedSqlWhere = "";
    refresh();
}

void SysCommuGroupMgt::onNaviDataChanged()
{
    //导航查询
    QVariantMap curNaviMap;
    curNaviMap = mNaviView->getAllValues().toVariant().toMap();

    QStringList sqlStrList;
    if (!curNaviMap.isEmpty()) {
        QString titleStr = curNaviMap.value("title").toString();
        QString sysnameStr = curNaviMap.value("sys_name").toString();
        QString plant = curNaviMap.value("attr_data.plant").toString();
        QString department = curNaviMap.value("attr_data.department").toString();
        if (!plant.isEmpty()) {
            QStringList strList = plant.split(",");
            sqlStrList.append(QString("attr_data#>>'{plant}' IN('%1')").arg(strList.join("','")));
        }
        if (!department.isEmpty()) {
            QStringList strList = department.split(",");
            sqlStrList.append(QString("attr_data#>>'{department}' IN('%1')").arg(strList.join("','")));
        }

        if (!titleStr.isEmpty()) {
            sqlStrList.append(QString("lower(title) like '%1%'").arg(titleStr.toLower()));
        }

        if (!sysnameStr.isEmpty()) {
            sqlStrList.append(QString("lower(sys_name) like '%%1%'").arg(sysnameStr.toLower()));
        }

        mFixedSqlWhere = sqlStrList.join(" AND ");
    } else {
        mFixedSqlWhere = "";
    }
    refresh();
}

QVariantList SysCommuGroupMgt::plantList()
{
    return mDetailView->plantList();
}

QVariantList SysCommuGroupMgt::departmentList()
{
    return mDetailView->departmentList();
}

QVariantMap SysCommuGroupMgt::departmentMap()
{
    return mDetailView->departmentMap();
}

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

void SysCommuGroupMgt::onSelectionChanged()
{
    if (mTableView != nullptr) {
        mSelectedLst = mTableView->selectedPrimaryKeys();
        int curIdInt = -1;
        if (!mSelectedLst.isEmpty()) {
            curIdInt = mSelectedLst.value(0).toInt();
        }

        if (mDetailView->uid().toInt() != curIdInt) {
            mDetailView->setLastUid(curIdInt);
            if (!mDetailView->isDataModified()) {
                mDetailView->setUid(curIdInt);
            }
        }

        refreshActionState();
    }
}

void SysCommuGroupMgt::onDetailSaved(const QVariant &iUidStr)
{
    this->refresh(false);
    mTableView->selectRow(iUidStr);
}

void SysCommuGroupMgt::onDetailChanged()
{
    bool isModified = mDetailView->isDataModified();
    mTableView->setEnabled(!isModified);
    if (isModified) {
        this->showMaskFrame(mBodySplitter->widget(0));
    } else {
        if (mBodySplitter->sizes().value(0) < 20) {
            mBodySplitter->setWidgetSize(0, mBodySplitter->getCacheSize(0), true);
        }
        this->hideMaskFrame();
    }
    refreshActionState();
}

TSqlSelectorV2 SysCommuGroupMgt::getSqlSelector(bool iResetPageBol)
{
    TSqlSelectorV2 selector;
    if (!mTableConf.dbSql.isEmpty()) {
        selector.setTable(QString("(%1) _TEMP_TABLE_").arg(mTableConf.dbSql));
    } else if (!mTableConf.dbTableName.isEmpty()) {
        selector.setTable(mTableConf.dbTableName);
    } else {
        // db_sql为空和db_table_name为空时不作处理
        return selector;;
    }
    selector.setField(mTableConf.queryFields);
    selector.setFieldFormat(mTableConf.fieldFormatMap);
    selector.setReturnRowCount(true);
    // 分页
    TopClassHelper::handleSearchPageOnQuery(nullptr, mPageTool, iResetPageBol, &selector);
    // 排序
    TopClassHelper::handleOrderOnQuery(mTableView, &mTableConf, &selector);
    // 搜索
    if (mSearchEntry != nullptr) {
        selector.addWhere(mSearchEntry->sqlWhere());
    }
    // 只获取有效数据
    if (!mTableConf.dbDelFlagKey.isEmpty()) {
        selector.addWhere(QString("%1 = 0 OR %1 IS NULL").arg(mTableConf.dbDelFlagKey));
    }
    // 过滤项
    if(!mTableConf.dbFilter.isEmpty()) {
        selector.addWhere(mTableConf.dbFilter);
    }
    if (!mFixedSqlWhere.isEmpty()) {
        selector.addWhere(mFixedSqlWhere);
    }
    if (!this->uid().isEmpty()) {
        selector.addWhere(QString("attr_data#>>'{department}' = (SELECT code from mes_workcenter WHERE id = '%1')").arg(this->uid()));
    }
    return selector;
}

void SysCommuGroupMgt::initTableView()
{
    mTableView = new TTableView(this);
    mTableView->setObjectName("TableView");
    mTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
    mTableView->verticalHeader()->setVisible(false);
    mTableView->horizontalHeader()->setSortIndicatorShown(true);
    mTableView->horizontalHeader()->setSectionsMovable(true);
    mTableView->horizontalHeader()->setStretchLastSection(true);
    mTableView->setHeaderPopupEnabled(true);

    mTableView->setDataKeyList(mTableConf.dataKeys);
    mTableView->setPrimaryKey(mTableConf.primaryKey);
    QVariantList headerItems = mTableConf.horizontalHeaders;
    headerItems.prepend(QVariant());
    mTableView->setHeaderItem(headerItems);

    connect(mTableView->horizontalHeader(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
            this, SLOT(refresh()));
}

void SysCommuGroupMgt::initNaviView()
{
    QString naviUiStr = ui("navi-view").toString();
    if (naviUiStr.isEmpty()) {
        return;
    }
    mNaviView = new TUiLoader(this);
    mNaviView->setScriptEngine(APP->scriptEngine());
    mNaviView->setSelf(this);
    mNaviView->setUiStr(naviUiStr);
}

void SysCommuGroupMgt::fillTableData(const TDataResponse &iDataRes)
{
    if (mPageTool != nullptr) {
        mPageTool->setRowCount(iDataRes.dataCount(), true);
    }
    QVariantList tableData = iDataRes.data().toList();
    TopClassHelper::formatTableData(this, &mTableConf, tableData);
    if (isHookExists("handleTableData")) {
        tableData = callHooksQuick("handleTableData", QVariantList() << QVariant(tableData)).toVariant().toList();
    }
    mTableView->loadData(tableData);
    mDetailView->setUid(-1);
}