#include "mainwindow.h"
#include "ui_mainwindow.h"


/**
 * @brief   切换到挂失页面
 *  点击工具栏的“挂失”触发
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-28
 */
void MainWindow::on_reportLossAction_triggered()
{
    ui->stackedWidget->setCurrentWidget(ui->reportLossPage);
}


/**
 * @brief   挂失卡
 * 该函数用于将指定用户的卡片设置为挂失状态。当用户点击“挂失”按钮时触发。
 * @details
 * 函数首先检查数据库连接状态，如果数据库未连接，显示警告信息并跳转到设置页面。
 * 然后检查是否填写了用户的学/工号。如果未填写，显示警告信息并返回。
 * 然后，函数在数据库中查询该学/工号是否存在。如果不存在，显示警告信息并返回。
 * 如果学/工号存在，函数将该用户的卡片状态设置为挂失（`status` = -1），并在操作成功后显示挂失成功的信息。
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-30
 */
void MainWindow::on_reportLossButton_clicked()
{
    if (!softwareReady())
    {
        QMessageBox::warning(this, QString("提示"), QString("数据库未连接，请设置。"));
        if (ui->stackedWidget->currentWidget() != ui->settingPage)
        {
            ui->stackedWidget->setCurrentWidget(ui->settingPage);
        }
        return;
    }

    if (!reportLossUserIdFilled)
    {
        QMessageBox::warning(this, "提示", "请填写学/工号。");
        return;
    }
    int userId = ui->reportLossUserIdBox->value();

    // 查询学/工号是否存在
    QSqlQuery query(db->getDatabase());
    query.prepare(QString("select `status` from card "
                          "where userId = :userId;"));
    query.bindValue(":userId", userId);
    bool success = query.exec();
    if (!success)
    {
        QMessageBox::warning(this, "提示", "数据库异常，挂失失败。");
        return;
    }
    if (!query.next())
    {
        QMessageBox::warning(this, "提示", "学/工号不存在，挂失失败。");
        return;
    }
    int cardStatus = query.value("status").toInt();
    if (cardStatus == -1)
    {
        QMessageBox::warning(this, "提示", "该卡已挂失，不可重复挂失。");
        return;
    }

    QString info, prompt = QString("如需挂失该学/工号绑定的卡，请输入密码。");
    success = verifyUser(userId, prompt, info);
    if (!success)
    {
        QMessageBox::warning(this, "提示", info + QString("\n验证用户失败。挂失失败，请重试。"));
        return;
    }

    // 将该学/工号的卡设置为挂失状态
    query.prepare(QString("update card "
                          "set `status` = -1 "
                          "where userId = :userId;"));
    query.bindValue(":userId", userId);
    success = query.exec();
    if (!success)
    {
        QMessageBox::warning(this, "提示", "数据库异常，挂失失败。");
        return;
    }

    QMessageBox::information(this, "提示", "挂失成功。");
    return;
}
