#include "JUserAccountsData.h"
#include <QSqlError>
#include <QSqlQuery>
#include <qDebug>

JUserAccountsData* JUserAccountsData::GetInstance()
{
    static JUserAccountsData pInstance1;
    return &pInstance1;
}

JUserAccountsData::JUserAccountsData()
{
    GetData();
}

JUserAccountsData::~JUserAccountsData()
{

}

void JUserAccountsData::GetData()
{
     QSqlDatabase db = QSqlDatabase::database();
     if (!db.isOpen()) 
     {
         //qWarning() << "���ݿ�δ��";
         return ;
     }

     // ��ѯ systemConfig ��
     QSqlQuery queryBond(db);
     queryBond.prepare(R"(
         SELECT UserName, DisplayName,UserId,PassWord,Privilege,WaitTime
         FROM User
     )");

     if (queryBond.exec()) 
     {
         while (queryBond.next()) 
         {
             UserAccounts _userInfo;
             _userInfo.UserName     = queryBond.value("UserName").toString();
             _userInfo.DisplayName  = queryBond.value("DisplayName").toString();
             _userInfo.UserId       = queryBond.value("UserId").toInt();
             _userInfo.passWord     = queryBond.value("PassWord").toString();
             _userInfo.Privilege    = queryBond.value("Privilege").toString();
             _userInfo.WaitTime     = queryBond.value("WaitTime").toInt();

             m_veUserAccounts.push_back(_userInfo);
         }
         // qDebug() << "Fetched fields:" << fieldsArray;
     } 
     else
     {
         qWarning() << "��ѯ systemConfig ʧ��:" << queryBond.lastError().text();
     }
}

void JUserAccountsData::Updata()
{
    m_db = QSqlDatabase::database();
    if (!m_db.isOpen())
    {
        //qWarning() << "���ݿ�δ��";
        return;
    }

    for (auto a: m_veUserAccounts)
    {
        AddOrUpdateUserAccount(a);
    }
}


void JUserAccountsData::AddOrUpdateUserAccount(UserAccounts& userInfo)
{
    QSqlQuery queryCheck(m_db);
    queryCheck.prepare(R"(
        SELECT COUNT(*)
        FROM User 
        WHERE UserId = :userId
    )");
    queryCheck.bindValue(":userId", userInfo.UserId);

    if (queryCheck.exec() && queryCheck.next()) {
        int count = queryCheck.value(0).toInt();
        if (count > 0) {
            // �û��Ѵ��ڣ����Ը��¸ü�¼
            QSqlQuery queryUpdate(m_db);
            queryUpdate.prepare(R"(
                UPDATE User 
                SET UserName = :userName, 
                    DisplayName = :displayName, 
                    PassWord = :passWord, 
                    Privilege = :privilege, 
                    WaitTime = :waitTime 
                WHERE UserId = :userId
            )");
            queryUpdate.bindValue(":userName",      userInfo.UserName);
            queryUpdate.bindValue(":displayName",   userInfo.DisplayName);
            queryUpdate.bindValue(":passWord",      userInfo.passWord);
            queryUpdate.bindValue(":privilege",     userInfo.Privilege);
            queryUpdate.bindValue(":waitTime",      userInfo.WaitTime);
            queryUpdate.bindValue(":userId",        userInfo.UserId);

            if (queryUpdate.exec()) {
                qDebug() << "User updated successfully";
            }
            else {
                qDebug() << "Update failed:" << queryUpdate.lastError().text();
            }
        }
        else
        {
            // �û������ڣ����Բ����¼�¼
            QSqlQuery queryInsert(m_db);
            queryInsert.prepare(R"(
                INSERT INTO User (UserName, DisplayName, UserId, PassWord, Privilege, WaitTime) 
                VALUES (:userName, :displayName, :userId, :passWord, :privilege, :waitTime)
            )");
            queryInsert.bindValue(":userName",    userInfo.UserName);
            queryInsert.bindValue(":displayName", userInfo.DisplayName);
            queryInsert.bindValue(":userId",      userInfo.UserId);
            queryInsert.bindValue(":passWord",    userInfo.passWord);
            queryInsert.bindValue(":privilege",   userInfo.Privilege);
            queryInsert.bindValue(":waitTime",    userInfo.WaitTime);

            if (queryInsert.exec()) {
                qDebug() << "User inserted successfully";
            }
            else {
                qDebug() << "Insert failed:" << queryInsert.lastError().text();
            }
        }
    }
    else {
        qDebug() << "Check user existence failed:" << queryCheck.lastError().text();
    }
}