#include "sysuserv1.h"
#include <QGraphicsDropShadowEffect>
#include <QResizeEvent>
#include <QToolBar>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/ttheme.h>
#include <tbaseutil/tenumlist.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topcore.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topenummanager.h>
#include <toputil/t.h>
#include <twidget/tmessagebar.h>
#include <twidget/ttableview.h>
#include <twidget/ttableviewdialog.h>
#include <twidget/tuiloader.h>
#include "sysuserv1thread.h"

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

    //产品相关 大致明白意思没有具体了解为什么这样做
    QVariant prodCfg = iUrlPars.value("product_category");
    if (prodCfg.type() == QVariant::List || prodCfg.type() == QVariant::StringList) {
        for (QVariant row : prodCfg.toList()) {
            mProductCategoryLst.append(row.toString());
        }
    } else if (!prodCfg.toString().isEmpty()) {
        mProductCategoryLst.append(prodCfg.toString());
    }
    if (mProductCategoryLst.isEmpty()) {
        mProductCategoryLst.append(APP->productCategory());
    }

    //初始化布局
    initCenterUi();

    //初始化窗口尺寸
    restoreSizeState();

    //初始化id
    uidChangeEvent(this->uid());

    //刷新当前模块Action状态;
    refreshActionState();
}

SysUserV1::~SysUserV1()
{
    this->saveSizeState();
}

//ui窗体设置
void SysUserV1::initCenterUi()
{
    //主窗口
    QWidget *centerWidget = new QWidget(this);
    this->setCentralWidget(centerWidget);

    //主布局:1,toolbar 2,mbodylayout
    QVBoxLayout *centerLayout = new QVBoxLayout(centerWidget);
    centerLayout->setMargin(0);
    centerLayout->setSpacing(0);
    if(QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))){
        centerLayout->addWidget(toolbar,0);
    }

    //局部布局
    mBodyLayout = new QHBoxLayout();
    mBodyLayout->setMargin(TTHEME_DP(16));
    mBodyLayout->setSpacing(0);
    centerLayout->addLayout(mBodyLayout, 1);

    //TUILoader配置
    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);
    mUiLoader->setUiStr(ui("user-info").toString());
    mBodyLayout->addWidget(mUiLoader,0);

    //数据更改关联功能。之前以为initdetail涵盖了数据修改 但uiloader数据修改其实应该具体设置
    connect(mUiLoader, SIGNAL(dataChanged()), this, SLOT(setDataModified()));
}

void SysUserV1::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{}");
    }
}

//uid变化模块
void SysUserV1::uidChangeEvent(const QString &iUidStr){

    //uid无值为初始0
    if(iUidStr.toInt() == 0){
        clearData();
    }else{
    //uid带值为选中id值
        t::loading(this);
        QVariant data = doThreadWork(new SysUserV1Thread(this), "LOAD_DATA", QVariant(this->uid()));
        unloading();

        TDataResponse dataRes(data.toMap());
        if(dataRes.hasError()){
            alertError(ttr("load data failed!"), dataRes.errText());
        }else{
            clearData();
            //问题:dataRes已经是data.tomap为什么还要取dataRes.data().toMap?
            //猜测:这里应该是对应存储功能中getData分割.字段的相反功能 带.字段载入
            QVariantMap dataMap = dataRes.data().toMap();
            QVariantMap attrData = dataMap.value("attr_data").toMap();
            for(QString key : attrData.keys()){
                dataMap.insert("attr_data." + key, attrData.value(key));
            }
            setData(dataMap);
            alertOk(ttr("Data loaded"));
        }
    }
    //设置状态栏调节:可
    mUiLoader->setState("status", "enable");
    //设置数据处于修改:否
    setDataModified(false);
}

void SysUserV1::clearData(){
    //载入 构造map 清空原数据
    mUiLoader->loadValues(QVariantMap(), true);
}

void SysUserV1::setData(const QVariantMap &iDataMap){
    //载入 形参map 不清原数据 须接收未显示字段 比如product_category
    mUiLoader->loadValues(iDataMap, false);
    //问题:原代码此处会设置setTitie 为什么需要设置?
}

//衔接mgt->newitem模块
void SysUserV1::create(){
    setLastUid(this->uid());
    //问题: true对应false设置效果不明
    setUid(0, true);
    mUiLoader->setState("status", "disable");

    QVariantMap defaultValueMap;
    defaultValueMap.insert("product_category", mProductCategoryLst);
    //意义不明未深究
    defaultValueMap = defaultValueMap.unite(config("default_value").toMap());
    //
    defaultValueMap
    setData(defaultValueMap);
    //设置数据处于修改 默认true
    setDataModified();
}

//取消模块  同时触发mgt-detailchanged 页面变化
void SysUserV1::reload(){
    QString uidStr = lastUid().isEmpty() ? uid() : lastUid();
    setUid(uidStr, true);
}

//保存模块
void SysUserV1::saveData(){
    //写报错不熟练
    //获取提交错误
    QVariantList errList = mUiLoader->validateAll("COMMIT", true, "ERROR");
    if(!errList.isEmpty()){
        QStringList errStrList;
        for(QVariant err : errList){
            errStrList.append(err.toMap().value("text").toString());
        }
        alertError(ttr("Saving data failed!"), errStrList.join("\n"));
        return;
    }
    t::saving(this);
    QVariantMap saveData = getData();
    //问题 意义不明? 对应_hooks_.js
    if(isHookExists("handleSaveData")){
        saveData = callHooksQuick("handleSaveData", QVariantList() << saveData).toVariant().toMap();
    }
    //
    QVariant data = doThreadWork(new SysUserV1Thread(this), "SAVE_DATA", saveData);
    //问题 unloading总是搭配doThreadwork使用?
    unloading();
    TDataResponse dataRes(data.toMap());
    //获取保存错误
    if(dataRes.hasError()){
        alertError(ttr("Save data failed!"),dataRes.errText());
    }else{
        setUid(dataRes.data().toInt());
        emit dataSaved(this->uid());
        APP->notify("sys-user-save");
        alertOk(ttr("Data Saved"));
    }
}

QVariantMap SysUserV1::getData() const{
    QVariantMap dataMap = mUiLoader->getAllValues(true).toVariant().toMap();
    QStringList keys = dataMap.keys();
    for(QString key : keys){
        if(key.contains(".")){
            QString keyfirst = key.split('.').first();
            QString keylast = key.split('.').last();
            QVariantMap map = dataMap.value(keyfirst,QVariantMap()).toMap();
            map.insert(keylast, dataMap.value(key));
            dataMap.insert(keyfirst, map);
            dataMap.remove(key);
        }
    }

    //问题:新建时 为什么要这样做
    //猜测:该字段不存在ui页面,mUiLoader->getAllValues无法获取,因此需要手动添加
    if (this->uid().toInt() == 0) {
        QVariantMap attrData = dataMap.value("attr_data").toMap();
        attrData.insert("effective_date", APP->getServerToday());
        dataMap.insert("attr_data", attrData);
    }
    if (dataMap.value("product_category").toStringList().isEmpty()) {
        dataMap.insert("product_category", mProductCategoryLst);
    }

    //mUiLoader->getAllValues无法获取id值 手动添加
    dataMap.insert("id", this->uid());
    return dataMap;
}