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

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

}

SysontactMgtThread::~SysontactMgtThread()
{

}

void SysontactMgtThread::run()
{
    if (invokeName() == "DELETE_USER") {
        deleteUser();
    } else if (invokeName() == "GET_TABLE_FIELD") {
        getTableField(invokeParameter().toString());
    } else if (invokeName() == "BATCH_INSERT") {
        batchInsertData(invokeParameter().toMap());
    }
}

void SysontactMgtThread::deleteUser()
{
    TDataResponse dataRes;
    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        TSqlDeleterV2 sqlDeleter;
        sqlDeleter.setTable("pub_contacts");
        sqlDeleter.setWhere("id", invokeParameter());
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlDeleter.setTable("pub_contacts_lnk_related");
        sqlDeleter.setWhere("contact_id", invokeParameter());
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlDeleter.setTable("pub_contacts_lnk_related");
        sqlDeleter.setWhere("related_id", invokeParameter());
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlDeleter.setTable("pub_customer_lnk_contact");
        sqlDeleter.setWhere("contact_id", invokeParameter());
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlDeleter.setTable("pub_supplier_lnk_contact");
        sqlDeleter.setWhere("contact_id", invokeParameter());
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

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

void SysontactMgtThread::batchInsertData(const QVariantMap &iDataMap)
{
    TDataResponse dataRes;
    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        QString table = iDataMap.value("table").toString();
        QStringList fields = iDataMap.value("field").toStringList();
        QVariantList data = iDataMap.value("data").toList();
        sqlQuery.batchInsert(table,fields,data);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

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

void SysontactMgtThread::getTableField(const QString iTableNameStr)
{
    TDataResponse dataRes;
    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        QStringList fieldList = sqlQuery.getFieldList(iTableNameStr);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

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