#include "sysconfig.h"
#include <QGraphicsDropShadowEffect>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <QResizeEvent>
#include <QToolBar>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/ttheme.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topcore.h>
#include <toputil/t.h>
#include <twidget/tmessagebar.h>
#include <twidget/tmessagebox.h>
#include <twidget/ttableview.h>
#include <twidget/ttableviewdialog.h>
#include <twidget/tuiloader.h>
#include "sysconfigthread.h"

SysConfig::SysConfig(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent)
    : TopClassAbs(iParent)
{
    this->setLicenseKey("sys_common");
    this->initModule(iModuleNameStr, iUrlPars);

    QWidget *centerWgt = new QWidget(this);
    this->setCentralWidget(centerWgt);
    QVBoxLayout *centerLayout = new QVBoxLayout(centerWgt);
    centerLayout->setMargin(0);
    centerLayout->setSpacing(0);

    if (QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))) {
        centerLayout->addWidget(toolbar, 0);
    }
    mBodyLayout = new QHBoxLayout();
    centerLayout->addLayout(mBodyLayout, 1);
    mBodyLayout->setMargin(TTHEME_DP(16));
    mBodyLayout->setSpacing(0);

    mUiLoader = new TUiLoader(this);
    mUiLoader->setScriptEngine(APP->scriptEngine());
    mUiLoader->setSelf(this);
    mUiLoader->setMaximumWidth(TTHEME_DP(config("maximum_size.width", 800).toInt()));
    mUiLoader->setProperty("SS_BG", "PANEL");
    mUiLoader->setProperty("SS_BORDER", 1);

    mBodyLayout->addStretch(1);
    mBodyLayout->addWidget(mUiLoader, 99999);
    mBodyLayout->addStretch(1);
    mUiLoader->setUiStr(ui("config-infov2").toString());

    connect(mUiLoader, SIGNAL(dataChanged()), this, SLOT(setDataModified()));

    //恢复窗体尺寸及布局;
    restoreSizeState();

    //当URL传入包含UID时, 在initModule()中会自动赋值给UID;
    //在界面初始化完成后执行uidChangeEvent, 填充界面数据;
    uidChangeEvent(this->uid());

    //刷新Action状态;
    refreshActionState();
}

SysConfig::~SysConfig()
{
    saveSizeState();
}

void SysConfig::reload()
{
    QString uidStr = lastUid().isEmpty() ? uid() : lastUid();
    setUid(uidStr, true);
}

void SysConfig::copy()
{
    setLastUid(this->uid());
    setUid(0, false);
    QVariantMap data;
    data.insert("id", "");
    data.insert("path", "");
    data.insert("name", "");
    setData(data);

    setTitle(ttr("New Config"));
    setDataModified(true);
}

void SysConfig::create()
{
    setLastUid(this->uid());
    setUid(0, true);
    //新建时可通过配置设置默认值
    setData(config("default_value").toMap());
    setDataModified(true);
}

void SysConfig::clearData()
{
    mUiLoader->loadValues(QVariantMap(), true);
}

void SysConfig::setData(const QVariantMap &iDataMap)
{
    mUiLoader->loadValues(iDataMap, false);

    if (iDataMap.contains("name")) {
        setTitle(ttr("Config - %1").arg(iDataMap.value("name").toString()));
    }
}

QVariantMap SysConfig::getData() const
{
    QVariantMap dataMap = mUiLoader->getAllValues().toVariant().toMap();
    dataMap.insert("id", this->uid());
    QVariantMap actionData;
    if (uid() == "0" || uid().isEmpty() || uid() == "") {
        actionData.insert("create_time", APP->getNow());
    } else {
        actionData.insert("update_time", APP->getNow());
    }
    dataMap.insert("action_data", actionData);
    return dataMap;
}

void SysConfig::saveData()
{
    // 有效性验证
    QVariantList errLst = mUiLoader->validateAll("COMMIT", true, "ERROR");
    if (!errLst.isEmpty()) {
        QStringList errStrLst;
        for (QVariant err : errLst) {
            errStrLst.append(err.toMap().value("text").toString());
        }
        alertError(ttr("Saving data failed!"), errStrLst.join("\n"));
        return;
    }

    t::saving(this);
    QVariant data = doThreadWork(new SysConfigThread(this), "SAVE_DATA", getData());
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(ttr("Save data failed!"),dataRes.errText());
    } else {
        setUid(dataRes.data().toInt());
        emit dataSaved(this->uid());
        alertOk(ttr("Save data success!"));
    }

}

void SysConfig::uidChangeEvent(const QString &iUidStr)
{
    if (iUidStr.toInt() == 0) {
        setTitle(ttr("New Config"));
        clearData();
    } else {
        t::loading(this);
        TSqlSelectorV2 selector;
        selector.setTable("pub_conf");
        selector.setField("*");
        QVariantMap formatMap;
        formatMap["tags"] = "array";
        selector.setFieldFormat(formatMap);
        selector.setWhere("id",iUidStr.toInt());

        QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_MAP, QVariant::fromValue(selector));
        TDataResponse dataRes(data.toMap());
        if (dataRes.hasError()) {
            alertError(ttr("Load data failed!"), dataRes.errText());
        } else {
            QVariantMap dataMap = dataRes.data().toMap();
            clearData();
            setData(dataMap);
            unloading();
        }
    }
    setDataModified(false);
}

void SysConfig::resizeEvent(QResizeEvent *iEvent)
{
    QSize size = iEvent->size();
    if (size.width() > this->perfectSize().width()) {
        mBodyLayout->setMargin(TTHEME_DP(16));
        mUiLoader->setProperty("SS_BORDER", 1);
        mUiLoader->setStyleSheet(".Q{}");
    } else {
        mBodyLayout->setMargin(0);
        mUiLoader->setProperty("SS_BORDER", 0);
        mUiLoader->setStyleSheet(".Q{}");
    }
}