#include "sysconfigthread.h"
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>

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

}

SysConfigThread::~SysConfigThread()
{

}

void SysConfigThread::run()
{
    if (invokeName() == "SAVE_DATA") {
        saveData(invokeParameter().toMap());
    }
}


void SysConfigThread::saveData(const QVariantMap &iDataMap)
{
    TDataResponse dataRes;

    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        TSqlSelectorV2 sqlSelector;
        sqlSelector.setTable("pub_conf");
        sqlSelector.setField("COUNT(1)");
        QVariantMap formatMap;
        formatMap["tags"] = "array";
        sqlSelector.setFieldFormat(formatMap);
        sqlSelector.addWhere("path", iDataMap["path"]);
        sqlSelector.addWhere("name", iDataMap["name"]);
        sqlSelector.addWhere("id", iDataMap.value("id").toInt(), "!=");
        int count = sqlQuery.selectCount(sqlSelector);
        if (count > 0) {
            throw TError(ttr("'%1'/%2 already exists!").arg(iDataMap.value("path").toString())
                         .arg(iDataMap.value("name").toString()), "ERROR", "ALREADY_EXISTS");
        }

        QVariantMap dataMap = TDataParse::replaceVariantMapEmptyItem(iDataMap);

        TSqlInserterV2 sqlInserter;
        sqlInserter.setTable("pub_conf");
        sqlInserter.setData(dataMap);
        QStringList fieldLst = dataMap.keys();
        fieldLst.removeOne("id");
        sqlInserter.setField(fieldLst);
        sqlInserter.setUniqueField("id");
        sqlInserter.setAutoIncrementField("id");
        sqlInserter.setUpdatePolicy("action_data", "json_merge");
        QVariant dataId = sqlQuery.replaceRow(sqlInserter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlQuery.commit();
        dataRes.setData(dataId);
        setInvokeResult(dataRes.toVariantMap());
        return;
    } catch (const TError &err) {
        dataRes.setError(err);
    } catch (...) {
        dataRes.setErrText(ttr("Unknow Error!"));
    }
    sqlQuery.rollback();
    setInvokeResult(dataRes.toVariantMap());
}