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


/**
 * @brief   切换到设置页面
 *  点击工具栏的“设置”触发。
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-27
 */
void MainWindow::on_settingAction_triggered()
{
    ui->stackedWidget->setCurrentWidget(ui->settingPage);
}


/**
 * @brief   更新状态栏的COM口号相关内容
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-27
 */
void MainWindow::updateStatusBarComNumber()
{
    if (reader.is_connected())
    {
        readerConnectStatusCheckBox->setChecked(true);
        QString s = "已连接读卡器COM：" + QString::number(reader.getComNumber());
        comNumberLabel->setText(s);
    }
    else
    {
        readerConnectStatusCheckBox->setChecked(false);
        QString s = "当前无连接";
        comNumberLabel->setText(s);
    }
}


/**
 * @brief   连接读卡器
 *  在连接读卡器部分点击“连接”按钮触发。
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-27
 */
void MainWindow::on_connectReaderButton_clicked()
{
    int comNumber = ui->comNumberBox->value();
    reader.setComNumber(comNumber);
    bool connectSuccess = reader.connect();

    if (!connectSuccess) {
        QString warningMessage = QString("COM") + QString::number(comNumber);
        warningMessage += QString("上未识别到读卡器。\n请输入正确的COM口号。");
        QMessageBox::warning(this, "读卡器状态提示", warningMessage);
    }

    updateStatusBarComNumber();
}


/**
 * @brief   连接数据库并检查设备名
 *  在连接数据库部分点击“连接”按钮触发。
 * @param   void
 * @return  void
 * @author  柯劲帆
 * @date    2024-07-27
 */
void MainWindow::on_connectDatabaseButton_clicked()
{
    if (db == nullptr)
    {
        db = new Database(QSqlDatabase::addDatabase("QMYSQL"), ui->ipAddrEdit->text(), ui->portBox->value(), ui->passwordEdit->text());
    }
    else
    {
        db->setHostName(ui->ipAddrEdit->text());
        db->setPort(ui->portBox->value());
        db->setPassword(ui->passwordEdit->text());
    }

    if (!db->open())
    {
        QMessageBox::warning(this, QString("数据库状态提示"), QString("数据库连接失败，请重试。"));
        databaseConnectStatusCheckBox->setChecked(false);
        databaseLabel->setText(QString("数据库未连接"));
        return;
    }
    databaseConnectStatusCheckBox->setChecked(true);
    databaseLabel->setText(QString("数据库已连接：") + db->getHostName() + QString(":") + QString::number(db->getPort()));

    device.setDevice(ui->deviceEdit->text(), db);
    if (!device.is_verified())
    {
        QMessageBox::warning(this, QString("设备名提示"), QString("该设备名无效，请重试。"));
    }
    deviceLabel->setText(device.getNameAndDepositAllowed());
}


/**
 * @brief   检查读卡器和数据库是否准备好
 * @param   void
 * @return  读卡器和数据库状态
 *  - true  已准备好
 *  - false 未准备好
 * @author  柯劲帆
 * @date    2024-07-27
 */
bool MainWindow::allReady()
{
    if (!reader.is_connected()) return false;
    if (db == nullptr || !db->is_connected()) return false;
    if (!device.is_verified()) return false;
    return true;
}


/**
 * @brief   检查数据库和设备名是否准备好
 * @param   void
 * @return  数据库状态和设备名设置状态
 *  - true  已准备好
 *  - false 未准备好
 * @author  柯劲帆
 * @date    2024-07-30
 */
bool MainWindow::softwareReady()
{
    if (db == nullptr || !db->is_connected()) return false;
    if (!device.is_verified()) return false;
    return true;
}


/**
 * @brief   检查数据库是否准备好
 * @param   void
 * @return  数据库状态
 *  - true  已准备好
 *  - false 未准备好
 * @author  柯劲帆
 * @date    2024-07-31
 */
bool MainWindow::databaseReady()
{
    if (db == nullptr || !db->is_connected()) return false;
    return true;
}
