#include "syscontact.h"
#include <QGraphicsDropShadowEffect>
#include <QResizeEvent>
#include <QSize>
#include <QToolBar>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/ttheme.h>
#include <tbaseutil/tenumlist.h>
#include <tbaseutil/tresource.h>
#include <tbaseutil/tlogger.h>
#include <tbaseutil/tfileio.h>
#include <tbaseutil/tlogitem.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topcore.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topenummanager.h>
#include <toputil/t.h>
#include <twidget/tuiloader.h>
#include <twidget/ttableview.h>
#include <twidget/tmessagebar.h>
#include <twidget/tmessagebox.h>
#include <twidget/ttableviewdialog.h>
#include <twidget/tpushbutton.h>
#include <twidget/tuiloaderdialog.h>
#include <twidget/tformlayout.h>
#include <twidget/tfiledialog.h>
#include "syscontactthread.h"
#include "pubcombolinecouplewideget.h"

SysContact::SysContact(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent) :
    TopClassAbs(iParent)
{
    this->setLicenseKey("pub_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"))){
        toolbar->setWindowTitle(ttr("ToolBar"));
        centerLayout->addWidget(toolbar,0);
    }

    mBodyLayout = new QVBoxLayout();
    centerLayout->addLayout(mBodyLayout, 1);
    mBodyLayout->setMargin(TTHEME_DP(16));
    mBodyLayout->setSpacing(0);

    mUiLoader = new TUiLoader(this);
    mUiLoader->setProperty("SS_BG", "BODY");
    mUiLoader->setScriptEngine(APP->scriptEngine());
    mUiLoader->setSelf(this);
    mUiLoader->setMaximumWidth(800);

    mUiLoader->setCreateCallback(this,SysContact::newDataItem);
    mUiLoader->setProperty("SS_BG", "PANEL");
    mUiLoader->setProperty("SS_BORDER", 1);

    mBodyLayout->addStretch(1);
    mBodyLayout->addWidget(mUiLoader, 99999);
    mBodyLayout->addStretch(1);

    mUiLoader->setUiStr(ui("contact-info").toString());

    mRelatedTableView = qobject_cast<TTableView*>(mUiLoader->getObject("CONTACT_RELATED_LIST"));
    if (mRelatedTableView != nullptr) {
        mRelatedTableView->verticalHeader()->setVisible(false);
        mRelatedTableView->setSelectionMode(TTableView::ExtendedSelection);
        mRelatedTableView->horizontalHeader()->setMinimumSectionSize(75);
        connect(mRelatedTableView->selectionModel(), &QItemSelectionModel::selectionChanged, [this](){mUiLoader->refreshState();});
    }

    if (QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))) {
        mBodyLayout->insertWidget(0, toolbar);
    }

    initSearchEntry();
    initUiItemMode();

    connect(mUiLoader, SIGNAL(dataChanged()), this, SLOT(setDataModified()));
    connect(this, SIGNAL(countChanged()), this, SLOT(setDataModified()));
    //恢复窗体尺寸及布局;
    restoreSizeState();

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

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

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

void SysContact::setObjectState(QStringList iObjNames, QString iStateStr)
{
    if (iObjNames.isEmpty() || iStateStr.isEmpty()) {
        return;
    }

    if (mUiLoader != nullptr) {
        for (QString name: iObjNames) {
            mUiLoader->setState(name, iStateStr);
        }
    }
}

QObject *SysContact::newDataItem(QObject *iObj, const QString &iTypeStr, const QVariant &iParamVar)
{
    Q_UNUSED(iParamVar);

    if (iTypeStr.toUpper() == "COMBOLINECOUPLEWIDGET") {
        TopClassAbs *parent = qobject_cast<TopClassAbs *>(iObj);
        if (parent != nullptr) {
            return new PubComboLineCoupleWideget(parent);
        } else {
            return nullptr;
        }
    }
    return nullptr;
}

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

void SysContact::copy()
{
    setLastUid(this->uid());
    setUid(0, false);
    mUiLoader->setValue(QString("id"), QVariant(""));
    mUiLoader->setValue(QString("name"), QVariant(""));
    setTitle(ttr("New Contact"));
    setDataModified(true);
}

void SysContact::create()
{
    setLastUid(this->uid());
    setUid(0, true);
    //    新建时可通过配置设置默认值
    if (!mDefaultSource.isEmpty()) {
        QVariantMap dataMap;
        dataMap.insert("source", mDefaultSource);
        setData(dataMap);
    }
    setDataModified(true);
}

void SysContact::clearData()
{
    if (mRelatedTableView != nullptr) {
        mRelatedTableView->loadData(QVariantList());
    }
    mUiLoader->loadValues(QVariantMap(), true);
    //mHeadPortraitBtn->setIcon(APP->getResIcon("add_person.$BODY_ICON_TAB"));
    //mHeadPortraitInfo.clear();
}

void SysContact::setData(const QVariantMap &iDataMap)
{
    QVariantMap dataMap = iDataMap;
    dataMap.insert("CONTACT_RELATED_LIST", getTransferedTableData(iDataMap.value("CONTACT_RELATED_LIST").toList()));
    if (isHookExists("handleDetailData")) {
        dataMap = callHooksQuick("handleDetailData", QVariantList()<<dataMap).toVariant().toMap();
    }
    mUiLoader->loadValues(dataMap, false);
    if (iDataMap.contains("name")) {
        setTitle(ttr("Contact-%1").arg(iDataMap.value("name").toString()));
    }
    /*
    if(!iDataMap.value("head_portrait").toByteArray().isEmpty())
    {
        mHeadPortraitInfo = iDataMap.value("head_portrait").toByteArray();
        QImage img = QImage::fromData(qUncompress(QByteArray::fromBase64(mHeadPortraitInfo)));
        QPixmap pixmap = QPixmap::fromImage(img);
        mHeadPortraitBtn->setIcon(pixmap);
    }
    else
    {
        mHeadPortraitBtn->setIcon(APP->getResIcon("add_person.$BODY_ICON_TAB"));
    }
    */
}

QVariantMap SysContact::getData() const
{
    QVariantMap dataMap = mUiLoader->getAllValues().toVariant().toMap();
    QStringList saveFieds = config("save_fields").toStringList();
    if (saveFieds.isEmpty()) {
        saveFieds = QStringList()<<"name"<<"sex"<<"status"<<"source"<<"source_serial"<<"company"
                                <<"department"<<"title"<<"remark"<<"nick_name"<<"address"<<"phone"
                               <<"mail"<<"fax"<<"other_mail"<<"idcard"<<"birth_date"<<"hobby"<<"other_contact"
                              <<"category"<<"security_level"<<"head_portrait"<<"tags";
    }
    dataMap = TDataParse::fetchVariantMapField(dataMap, saveFieds);
    if (uid().toInt() > 0) {
        dataMap.insert("id", uid());
    }
    if (mRelatedTableView != nullptr) {
        dataMap.insert("CONTACT_RELATED_LIST", mRelatedTableView->allDataMap());
    }
    dataMap = TDataParse::replaceVariantMapEmptyItem(dataMap);
    QString category = dataMap["category"].toString();
    dataMap["category"] = QStringList() << category;

    return dataMap;
}

void SysContact::saveData()
{
    QVariantList errLst = mUiLoader->validateAll("COMMIT", true, "ERROR");
    if (!errLst.isEmpty()) {
        QStringList errStrLst;
        for (QVariant err: errLst) {
            errStrLst.append(err.toMap().value("text").toString());
        }
        TMessageBox::error(this, ttr("Saving data failed!"), errStrLst.join("\n"));
        return ;
    }

    t::saving(this);
    QVariantMap dataMap = getData();
    QVariant data = doThreadWork(new SysContactThread(this), "SAVE_DATA", dataMap);
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        if (dataRes.errCode() == "ALREADY_EXISTS") {
            alertError(ttr("Save data failed!"), ttr("Contact [%1] already exists!").arg(dataMap.value("name").toString()));
        } else {
            alertError(ttr("Save data failed!"), dataRes.errText());
        }
    } else {
        setUid(dataRes.data().toInt());
        emit dataSaved(this->uid());
        alertOk(ttr("Data saved"));
    }
}

TUiLoader *SysContact::uiLoader()
{
    return mUiLoader;
}

void SysContact::setDefaultSource(const QString &iSource)
{
    if (iSource != mDefaultSource) {
        mDefaultSource = iSource;
    }
}

void SysContact::addRelevantContacts()
{
    if (mRelatedTableView == nullptr) {
        return;
    }

    TTableViewDialog *dialog = new TTableViewDialog(this);
    dialog->setTitle(ttr("Add Contact"));
    dialog->setButtons(QStringList() << ttr("Ok")+":Ok:Yes" << ttr("Cancel")+":Cancel:Cancel" << ttr("Clear All")+":UnselectAll:ResetRole");

    QVariantList headeritems;
    headeritems << QVariant();
    QVariantMap col1;
    col1.insert("name","id");
    col1.insert("display",ttr("Id"));
    col1.insert("resizeMode","Interactive");
    col1.insert("size",100);
    col1.insert("displayRole","$id");
    headeritems.append(col1);

    QVariantMap col2;
    col2.insert("name","name");
    col2.insert("display",ttr("Name"));
    col2.insert("resizeMode","Interactive");
    col2.insert("size",100);
    col2.insert("displayRole","$name");
    headeritems.append(col2);

    QVariantMap col0;
    col0.insert("name","sex");
    col0.insert("display",ttr("Sex"));
    col0.insert("resizeMode","Interactive");
    col0.insert("size",100);
    col0.insert("displayRole","$sex.text");
    col0.insert("decorationRole","$sex.icon");
    headeritems.append(col0);

    QVariantMap col3;
    col3.insert("name","status");
    col3.insert("display",ttr("Status"));
    col3.insert("resizeMode","Interactive");
    col3.insert("size",100);
    col3.insert("displayRole","$status");
    headeritems.append(col3);

    QVariantMap col4;
    col4.insert("name","source");
    col4.insert("display",ttr("Source"));
    col4.insert("resizeMode","Interactive");
    col4.insert("size",100);
    col4.insert("displayRole","$source");
    headeritems.append(col4);

    QVariantMap col5;
    col5.insert("name","source_serial");
    col5.insert("display",ttr("Source Serial"));
    col5.insert("resizeMode","Interactive");
    col5.insert("size",100);
    col5.insert("displayRole","$source");
    headeritems.append(col5);

    QVariantMap col6;
    col6.insert("name","company");
    col6.insert("display",ttr("Company"));
    col6.insert("resizeMode","Interactive");
    col6.insert("size",150);
    col6.insert("displayRole","$company");
    headeritems.append(col6);

    QVariantMap col7;
    col7.insert("name","department");
    col7.insert("display",ttr("Department"));
    col7.insert("resizeMode","Interactive");
    col7.insert("size",150);
    col7.insert("displayRole","$department");
    headeritems.append(col7);

    QVariantMap col8;
    col8.insert("name","title");
    col8.insert("display",ttr("Title"));
    col8.insert("resizeMode","Interactive");
    col8.insert("size",120);
    col8.insert("displayRole","$title");
    headeritems.append(col8);

    QVariantMap col9;
    col9.insert("name","remark");
    col9.insert("display",ttr("Remark"));
    col9.insert("resizeMode","Stretch");
    col9.insert("displayRole","$remark");
    headeritems.append(col9);
    dialog->setPrimaryKey("id");
    dialog->setDataKeyList(QStringList() << "related_id" << "id" << "name" << "status" << "sex" << "source" << "source_serial" << "company" << "department" << "title" << "remark" << "sex.text" << "sex.icon");
    dialog->setHeaderItem(headeritems);
    dialog->setSearchKeys(QStringList() << "name"  << "company");
    dialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
    dialog->searchEntry()->setPlaceholderText(ttr("Search %1"));

    QVariantList table_data;
    QVariantList exists = mRelatedTableView->allPrimaryKey();
    QVariantList allDbData = getAllContactList(exists);

    for (QVariant row: allDbData) {
        QVariantMap rowMap = row.toMap();
        //filter self
        if (rowMap.value("id").toString() == uid()) {
            continue;
        }

        rowMap.insert("related_id",rowMap.value("id"));
        table_data.append(rowMap);
    }
    dialog->loadData(getTransferedTableData(table_data));
    dialog->resize(760, 560);

    QVariantList selLst = dialog->run();
    QModelIndexList indexs =  mRelatedTableView->appendRows(selLst);
    mRelatedTableView->unselectAll();
    mRelatedTableView->selectRows(indexs);
    mRelatedTableView->scrollToBottom();
}

void SysContact::setContactRelation()
{
    QVariantList lst = mRelatedTableView->selectedRowDataMaps(true);
    if (lst.isEmpty()) {
        return;
    }

    // QVariant datamap = list.first();
    QString items = "[{ "\
                    "name : 'Widget', "\
                    "type : 'Widget',"\
                    "property : {},"\
                    "pack : {},"\
                    "child : {"\
                    "name : 'fayout',"\
                    "type : 'FormLayout',"\
                    "property : {spacing:10},"\
                    "child : ["\
                    "{"\
                    "name : 'relation'," \
                    "type : 'EditableComboBox'," \
                    "title : 'Relation'," \
                    "property : {item_list:self.getEditableComboBoxList(\"sys-contact-relation\")},\n"\
                    "pack : {label: self.ttr(\"Relation\")}," \
                    "validate: function(obj,val,title,moment,self){"\
                    "if (val.trim() == ''){"\
                    "return [title + self.ttr(\" cannot be null!\"),'Error'];"\
                    "}"\
                    "return;"\
                    "}"\
                    "},"\
                    "]"\
                    "},"\
                    "},]";

    TUiloaderDialog *dlg = new TUiloaderDialog(this);
    dlg->setSelf(this);
    dlg->setTitle(ttr("Set Contact Relation"));
    dlg->resize(250, 150);
    dlg->setButtons(QStringList() << ttr("Setting") + ":Ok:Yes" << ttr("Cancel") + ":Close:Reject");
    dlg->uiLoader()->setScriptEngine(APP->scriptEngine());
    dlg->setUiStr(items);
    QVariantMap res = dlg->run();
    if (res.isEmpty()) {
        return;
    }

    QString relation = res.value("relation").toString();
    TTableModel* model = qobject_cast<TTableModel *>(mRelatedTableView->model());
    for (QModelIndex index: mRelatedTableView->selectedIndexes()) {
        QVariantMap rowMap = model->rowDataMap(index);
        rowMap.insert("relation", relation);
        mRelatedTableView->setRowData(index, QVariant(rowMap), true);
    }
}

void SysContact::OnHeadPortraitBtnClicked()
{
    /*
    QString imageFile = TFileDialog::getOpenFileName(this);
    if(imageFile.isEmpty())
        return;

    QByteArray headPortraitInfo;
    if (imageFile.endsWith(".svg", Qt::CaseInsensitive)) {
        QString str = TFileIo::readFileString(imageFile);
        if (!str.startsWith("<?xml", Qt::CaseInsensitive)) {
            str = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + str;
        }

        headPortraitInfo = qCompress(str.toUtf8(), 9).toBase64();
    }
    else {
        headPortraitInfo = TFileIo::readFileBase64(imageFile, 9);
    }

    mHeadPortraitInfo = headPortraitInfo;
    mHeadPortraitBtn->setIcon(QIcon(QPixmap(imageFile)));
    */
}

void SysContact::OnCompanyBtnClicked(QString pSource)
{
    TTableViewDialog *dialog = new TTableViewDialog(this);
    dialog->resize(800,400);
    dialog->setTitle( ttr("Select"));
    dialog->setButtons(QStringList() << ttr("Ok") + ":Ok:Yes" << ttr("Cancel") + ":Cancel:Cancel");

    QVariantList headeritems;
    headeritems << QVariant();
    QVariantMap col;
    col.insert("name","source");
    col.insert("display",ttr("Source"));
    col.insert("resizeMode","Interactive");
    col.insert("size",100);
    col.insert("displayRole","$source");
    headeritems.append(col);

    QVariantMap col1;
    col1.insert("name","id");
    col1.insert("display",ttr("ID"));
    col1.insert("resizeMode","Interactive");
    col1.insert("size",100);
    col1.insert("displayRole","$id");
    headeritems.append(col1);

    QVariantMap col2;
    col2.insert("name","code");
    col2.insert("display",ttr("Code"));
    col2.insert("resizeMode","Interactive");
    col2.insert("size",100);
    col2.insert("displayRole","$code");
    headeritems.append(col2);

    QVariantMap col3;
    col3.insert("name","short_name");
    col3.insert("display",ttr("Short Name"));
    col3.insert("resizeMode","Interactive");
    col3.insert("size",100);
    col3.insert("displayRole","$short_name");
    headeritems.append(col3);

    QVariantMap col4;
    col4.insert("name","fullname");
    col4.insert("display",ttr("Full Name"));
    col4.insert("resizeMode","Interactive");
    col4.insert("size",100);
    col4.insert("displayRole","$fullname");
    headeritems.append(col4);

    QVariantMap col5;
    col5.insert("name","fullname_en");
    col5.insert("display",ttr("Full Name(En)"));
    col5.insert("resizeMode","Interactive");
    col5.insert("size",100);
    col5.insert("displayRole","$fullname_en");
    headeritems.append(col5);

    QVariantMap col0;
    col0.insert("name","status");
    col0.insert("display",ttr("Status"));
    col0.insert("resizeMode","Interactive");
    col0.insert("size",150);
    col0.insert("displayRole","$status");
    headeritems.append(col0);

    QVariantMap col6;
    col6.insert("name","category");
    col6.insert("display",ttr("Category"));
    col6.insert("resizeMode","Interactive");
    col6.insert("size",150);
    col6.insert("displayRole","$category");
    headeritems.append(col6);

    QVariantMap col8;
    col8.insert("name","region");
    col8.insert("display",ttr("Region"));
    col8.insert("resizeMode","Interactive");
    col8.insert("size",120);
    col8.insert("displayRole","$region");
    headeritems.append(col8);

    QVariantMap col10;
    col10.insert("name","remark");
    col10.insert("display",ttr("Remark"));
    col10.insert("resizeMode","Stretch");
    col10.insert("displayRole","$remark");
    headeritems.append(col10);

    QStringList dbdatalist;
    dbdatalist << "id" << "code" << "short_name" << "fullname" << "fullname_en"  << "status"
               << "category" << "region" << "remark";
    QStringList table_key_list = dbdatalist;
    table_key_list.append("source");
    dialog->setPrimaryKey("fullname");
    dialog->setDataKeyList(table_key_list);
    dialog->setHeaderItem(headeritems);
    dialog->searchEntry()->setPlaceholderText(ttr("Search"));
    dialog->searchEntry()->setSearchDelayTime(1);
    dialog->setSearchKeys(QStringList() << "code" << "short_name" << "fullname");
    dialog->tableView()->verticalHeader()->setVisible(false);
    dialog->setSearchText("");
    dialog->setSelectionMode(QAbstractItemView::SingleSelection);

    QVariantList table_data;
    QVariantList supplier_db_data,customer_db_data;
    if (pSource.compare("customer") == 0) {
        customer_db_data = getAllCustomerList();
        if (!customer_db_data.isEmpty()) {
            for (QVariant row: customer_db_data){
                QVariantMap rowmap = row.toMap();
                if (!rowmap.value("status").toString().isEmpty()) {
                    rowmap.insert("status",TOPENM->enumList("pub-customer-status")->itemText(rowmap.value("status").toString()));
                }
                rowmap.insert("source",ttr("Customer"));
                table_data.append(QVariant(rowmap));
            }
        }
    } else if(pSource.compare("supplier") == 0) {
        supplier_db_data = getAllSupplierList();
        if (!supplier_db_data.isEmpty()) {
            for (QVariant row: supplier_db_data) {
                QVariantMap rowmap = row.toMap();
                if (!rowmap.value("status").toString().isEmpty()) {
                    rowmap.insert("status",TOPENM->enumList("pub-supplier-status")->itemText(rowmap.value("status").toString()));
                }
                rowmap.insert("source",ttr("Supplier"));
                table_data.append(QVariant(rowmap));
            }
        }
    }

    dialog->loadData(table_data);
    QVariantList selLst = dialog->run();
    if (selLst.isEmpty()) {
        return;
    }

    QVariantMap map = selLst.first().toMap();
    if (!map.value("fullname").toString().isEmpty()) {
        mUiLoader->setValue("company",QScriptValue(map.value("fullname").toString()));
    }
}

void SysContact::moveRowsUpOrDown(bool iIsUp)
{
    if (mRelatedTableView != nullptr) {
        if (iIsUp) {
            mRelatedTableView->moveSelectedRowsUp();
        } else {
            mRelatedTableView->moveSelectedRowsDown();
        }
    }
}

void SysContact::removeSelectedRows()
{
    if (mRelatedTableView != nullptr) {
        mRelatedTableView->removeSelectedRows();
    }
}

QStringList SysContact::getEditableComboBoxList(const QString &iEnumName)
{
    QStringList res;
    for (QVariant enumItem: TOPENM->enumList(iEnumName)->toComboList()) {
        QVariantMap enumMap = enumItem.toMap();
        res << enumMap.value("text").toString();
    }
    return res;
}

void SysContact::uidChangeEvent(const QString &iUidStr)
{
    if (iUidStr.toInt() == 0) {
        setTitle(ttr("New Contact"));
        clearData();
    } else {
        t::loading(this);
        QVariantMap argMap;
        argMap.insert("id",this->uid());
        QVariant data = doThreadWork(new SysContactThread(this), "LOAD_DATA",argMap);
        unloading();
        TDataResponse dataRes(data.toMap());
        if (dataRes.hasError()) {
            alertError(ttr("Load data failed!"), dataRes.errText());
        } else {
            QVariantMap dataMap = dataRes.data().toMap();
            clearData();
            setData(dataMap);
            alertOk(ttr("Data loaded"));
        }
    }
    setDataModified(false);
}

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

void SysContact::onDoSearch(const QString &iSearchStr, const QVariant &iOptions)
{
    if (mRelatedTableView) {
        QRegExp rx(iSearchStr);
        rx.setPatternSyntax(QRegExp::Wildcard);
        rx.setCaseSensitivity(Qt::CaseInsensitive);
        QStringList searchlist = iOptions.toStringList();
        if (searchlist.isEmpty()) {
            searchlist = mSearchKey;
        }

        mRelatedTableView->findRows(rx,searchlist,1);
        alertOk(ttr("Data loaded"));
    }
}

QVariantList SysContact::getTransferedTableData(const QVariantList &iDataLst)
{
    QVariantList dataLst;
    //枚举转换
    TEnumList *enumPeopleSex = TOPENM->enumList("sys-sex");
    TEnumList *enumContactStatus = TOPENM->enumList("sys-contact-status");
    TEnumList *enumContactDepartment = TOPENM->enumList("sys-contact-department");
    TEnumList *enumContactTitle = TOPENM->enumList("sys-contact-title");
    TEnumList *enumContactCategory = TOPENM->enumList("sys-contact-category");
    TEnumList *enumContactSource = TOPENM->enumList("sys-contact-source");

    for (QVariant row: iDataLst) {
        QVariantMap rowMap = row.toMap();

        if (enumPeopleSex != nullptr) {
            QString sexStr = rowMap.value("sex").toString();
            rowMap.insert("sex.icon", enumPeopleSex->itemIcon(sexStr));
            rowMap.insert("sex.text", enumPeopleSex->itemText(sexStr));
        }

        if (enumContactSource != nullptr) {
            QString sourceStr = rowMap.value("source").toString();
            rowMap.insert("source", enumContactSource->itemText(sourceStr));
        }

        if (enumContactStatus != nullptr) {
            QString statusStr = rowMap.value("status").toString();
            rowMap.insert("status", enumContactStatus->itemText(statusStr));
        }

        if (enumContactDepartment != nullptr) {
            QString departmentStr = rowMap.value("department").toString();
            rowMap.insert("department", enumContactDepartment->itemText(departmentStr));
        }

        if (enumContactTitle != nullptr) {
            QString titleStr = rowMap.value("title").toString();
            rowMap.insert("title", enumContactTitle->itemText(titleStr));
        }

        if (enumContactCategory != nullptr) {
            QString categoryStr = rowMap.value("category").toString();
            rowMap.insert("category", enumContactCategory->itemText(categoryStr));
        }

        dataLst.append(rowMap);
    }
    return dataLst;
}

void SysContact::initSearchEntry()
{
    if (TSearchEntry *searchentry = qobject_cast<TSearchEntry *>(mUiLoader->getObject("search"))) {
        QVariantList searchOptionLst;

        QVariantMap option;
        option.insert("name", "relation");
        option.insert("text", ttr("Relation"));
        searchOptionLst.append(option);

        QVariantMap option2;
        option2.insert("name", "name");
        option2.insert("text", ttr("Name"));
        searchOptionLst.append(option2);

        searchentry->setPlaceholderText(ttr("Search %1"));
        searchentry->setSearchDelayTime(1);
        searchentry->setOptionList(searchOptionLst);
        mSearchKey << "relation" << "name";

        connect(searchentry, SIGNAL(search(QString,QVariant)), this, SLOT(onDoSearch(QString,QVariant)));
    }
}

void SysContact::initUiItemMode()
{
    QVariantMap item_map = config("itemMode").toMap();
    QStringList keyLst = item_map.uniqueKeys();
    for (QString key: keyLst) {
        if (item_map.value(key).toString().compare("hide", Qt::CaseInsensitive) == 0) {
            mUiLoader->setState(key, "HIDE");
        } else if(item_map.value(key).toString().compare("disable", Qt::CaseInsensitive) == 0) {
            mUiLoader->setState(key, "DISABLE");
        } else if(item_map.value(key).toString().compare("show", Qt::CaseInsensitive) == 0) {
            mUiLoader->setState(key, "SHOW");
        }
    }
}

QVariantList SysContact::getAllCustomerList()
{
    TSqlSelectorV2 selector;
    selector.setTable("pub_customer");
    selector.fieldRef() << "id" << "code" << "short_name" << "fullname"
                        << "fullname_en" << "status" << "category"
                        << "region" << "remark";
    selector.addOrder("id",Qt::AscendingOrder);

    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    TDataResponse customerdataRes(data.toMap());
    if (customerdataRes.hasError()) {
        TLOG_ERROR(customerdataRes.errText());
        return QVariantList();
    }
    QVariantList customerData = customerdataRes.data().toList();
    return customerData;
}

QVariantList SysContact::getAllSupplierList()
{
    TSqlSelectorV2 selector;
    selector.setTable("pub_supplier");
    selector.fieldRef() << "id" << "code" << "short_name" << "fullname"
                        << "fullname_en" << "status" << "category"
                        << "region" << "remark";
    selector.addOrder("id",Qt::AscendingOrder);

    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    TDataResponse supplierdataRes(data.toMap());
    if (supplierdataRes.hasError()) {
        TLOG_ERROR(supplierdataRes.errText());
        return QVariantList();
    }
    QVariantList supplierData = supplierdataRes.data().toList();
    return supplierData;
}

QVariantList SysContact::getAllContactList(QVariantList iExistIdLst)
{
    TSqlSelectorV2 selector;
    selector.setTable("pub_contacts");
    selector.fieldRef() << "id" << "name" << "status" << "sex" << "source"
                        <<  "source_serial" << "company" <<  "department"
                         << "title"  <<  "remark";
    selector.addWhere("id",iExistIdLst,"!=");
    selector.addOrder("id",Qt::DescendingOrder);

    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    TDataResponse contactdataRes(data.toMap());
    if (contactdataRes.hasError()) {
        TLOG_ERROR(contactdataRes.errText());
        return QVariantList();
    }
    QVariantList contactData = contactdataRes.data().toList();
    return contactData;
}

QString SysContact::getLogRemarkInfo(QVariantMap iOldData, QVariantMap iNewData)
{
    QStringList newKeyLst = iNewData.uniqueKeys();
    QStringList lst;
    for (QString keyEle: newKeyLst) {
        if(iNewData.value(keyEle).toString() != iOldData.value(keyEle).toString())
        {
            QString str = QString("%1 : %2 -> %3").arg(keyEle).arg(iOldData.value(keyEle).toString()).arg(iNewData.value(keyEle).toString());
            lst.append(str);
        }
    }
    return lst.join(" ; ");
}