#include "sysuserv1thread.h"
#include <topcore/topclassabs.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>

SysUserV1Thread::SysUserV1Thread(QObject *iParent)
    : TopClassThreadAbs(iParent)
{

}
SysUserV1Thread::~SysUserV1Thread()
{

}
void SysUserV1Thread::run()
{
    if (invokeName() == "LOAD_DATA") {
        loadData(invokeParameter().toInt());
    } else if (invokeName() == "SAVE_DATA") {
        saveData(invokeParameter().toMap());
    }
}

//iIdInt  invokeParameter().toInt()
void SysUserV1Thread::loadData(int iIdInt)
{
    //dataRes传回给QVariant data = doThreadWork(new SysUserV1Thread(this), "LOAD_DATA", QVariant(this->uid()))定义的data对象
    TDataResponse dataRes;
    //TSql这个类执行sql语句,获取一个数据库,这个数据库在软件里选择
    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin(); // 开始操作数据库
    try {
        // Selector:查
        TSqlSelectorV2 sqlSelector;
        //将sys_user取小名为U,左连接pub_contacts表,pub_contacts的小名为C,两表连接的条件是U.contcat_id = C.id
        sqlSelector.setTable("sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id");
        //设置要查找的字段,查找的字段是U里面所有表格的C.mail
        //这是查的内容
        sqlSelector.setField("U.*, C.mail");
        //设置查找条件U.id==QVariant(iIdInt)
        sqlSelector.setWhere("U.id", QVariant(iIdInt));
        //设置表里"product_category"字段的格式为数组
        sqlSelector.setFieldFormat("product_category", "array");
        sqlSelector.setFieldFormat("attr_data", "json");
        //sqlQuery是执行器,用来执行sqlSelector表格,会返回查询结果给dataMap
        QVariantMap dataMap = sqlQuery.selectMap(sqlSelector);
        //这句话是在看查询语句是否错误,如果错误,抛出错误:可以看到这个错
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        //提交:把执行结果提交给数据库
        sqlQuery.commit();

        //dataMap是查询结果,要把dataMap传回给dataRes,然后再
        dataRes.setData(dataMap);
        //设置结果:把dataRes返回给data
        setInvokeResult(dataRes.toVariantMap());
        return;
        //捕获异常
    } catch (const TError &err) {
        dataRes.setError(err);
    } catch (...) {
        dataRes.setErrText(ttr("Unknow Error!"));
    }
    //回滚:改了一个东西,但发现错了,就撤回SQL操作
    sqlQuery.rollback();
    //再次把结果传给data
    setInvokeResult(dataRes.toVariantMap());
}

void SysUserV1Thread::saveData(const QVariantMap &iDataMap)
{
    TDataResponse dataRes;
    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        TSqlSelectorV2 sqlSelector;
        sqlSelector.setTable("sys_user");
        sqlSelector.setField("COUNT(1)");
        sqlSelector.addWhere("username", iDataMap.value("username"));
        sqlSelector.addWhere("id", iDataMap.value("id"), "!=");
        int count = sqlQuery.selectCount(sqlSelector);
        if (count > 0) {
            throw TError(ttr("'%1' already exists!").arg(iDataMap.value("username").toString()), "ERROR", "ALREADY_EXISTS");
        }

        // 更新pub_contacts表的mail
        QVariantMap contactMap;
        contactMap.insert("mail", iDataMap.value("mail"));
        QString username = iDataMap.value("username").toString();
        QString fullname = iDataMap.value("fullname").toString();
        QString name;
        if (!fullname.isEmpty() && (username != fullname)) {
            name = QString("%1(%2)").arg(fullname).arg(username);
        } else {
            name = username;
        }
        contactMap.insert("name", name);
        contactMap.insert("id", iDataMap.value("contcat_id").toInt());
        contactMap.insert("source", "company");
        contactMap.insert("status", iDataMap.value("status").toString() == "active" ? "active" : "inactive");
        TopClassAbs *parentModule = static_cast<TopClassAbs*>(this->parent());
        if (parentModule) {
            if (parentModule->isHookExists("handleContactData")) {
                contactMap = parentModule->callHooksQuick("handleContactData", QVariantList()<<contactMap<<iDataMap).toVariant().toMap();
            }
        }
        QStringList contactFields = contactMap.keys();
        contactFields.removeOne("id");

        TSqlInserterV2 sqlInserter;
        sqlInserter.setTable("pub_contacts");
        sqlInserter.setData(contactMap);
        sqlInserter.setField(contactFields);
        sqlInserter.setUniqueField("id");
        sqlInserter.setAutoIncrementField("id");

        QVariant contactId = sqlQuery.replaceRow(sqlInserter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        // 更新sys_commu_grp_detail
        TSqlUpdaterV2 sqlUpdater;
        sqlUpdater.setTable("sys_commu_grp_detail");
        sqlUpdater.setField(QStringList() << "address" << "name");
        QVariantMap commuGrpDetailDataMap;
        commuGrpDetailDataMap.insert("address", iDataMap.value("mail"));
        commuGrpDetailDataMap.insert("name", name);
        sqlUpdater.setData(commuGrpDetailDataMap);
        TSqlWhereCompsiteV2 commuGrpDetailWhere;
        commuGrpDetailWhere.append("src_type", "pub_contacts");
        commuGrpDetailWhere.append("src_uid", iDataMap.value("contcat_id").toString());
        commuGrpDetailWhere.setLogic(TSqlWhereCompsiteV2::Logic_And);
        sqlUpdater.setWhere(commuGrpDetailWhere);
        sqlQuery.updateRow(sqlUpdater);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        // 更新sys_user表
        QVariantMap dataMap = iDataMap;
        QStringList fieldLst = dataMap.keys();
        dataMap.insert("contcat_id", contactId);

        QStringList productCategory = dataMap.value("product_category").toStringList();
        // 只要产品分类列表中包含有*, 就只存*
        if (productCategory.contains("*")) {
            productCategory = (QStringList() << "*");
        }
        dataMap.insert("product_category", productCategory);

        if (iDataMap.value("id").toInt() == 0) {
            // 新建时插入默认密码
            QString password = iDataMap.value("password").toString();
            if (password.isEmpty()) {
                password = QStringLiteral("123456");
            }
            dataMap.insert("password", TDataParse::getVariantMd5(password));
        } else {
            fieldLst.removeOne("password");
        }
        fieldLst.removeOne("id");
        fieldLst.removeOne("mail");
        QVariantMap attrDataMap = dataMap.value("attr_data").toMap();
        if (attrDataMap.value("password_validity_control") == 0) {
            attrDataMap.insert("effective_date", QString(""));
            attrDataMap.insert("validity_period", QString(""));
            dataMap.insert("attr_data", attrDataMap);
        }
        qDebug().noquote().nospace()<<TDataParse::variant2JsonStr(dataMap);
        sqlInserter.clear();
        sqlInserter.setTable("sys_user");
        sqlInserter.setData(dataMap);
        sqlInserter.setField(fieldLst);
        sqlInserter.setUpdatePolicy("attr_data", "json_merge");
        sqlInserter.setUniqueField("id");
        sqlInserter.setAutoIncrementField("id");

        QVariant userId = sqlQuery.replaceRow(sqlInserter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }
        sqlQuery.commit();
        dataRes.setData(userId);
        setInvokeResult(dataRes.toVariantMap());
        return;
    } catch (const TError &err) {
        dataRes.setError(err);
    } catch (...) {
        dataRes.setErrText(ttr("Unknow Error!"));
    }
    sqlQuery.rollback();
    setInvokeResult(dataRes.toVariantMap());
}