#include "newdeviceformdialog.h"
#include "ui_newdeviceformdialog.h"
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QFileDialog>
#include <QSqlRecord>
#include <QListView>
#include <QComboBox>
#include <QStandardItemModel>

#include <QDebug>
#include <hv/hlog.h>

#include "frame_define.h"
#include "globalparameters.h"
#include "kutilities.h"


NewDeviceFormDialog::NewDeviceFormDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::NewDeviceFormDialog)
{
    ui->setupUi(this);

    InitializeUi();

    connect(ui->pb_OK, &QPushButton::clicked, this, &NewDeviceFormDialog::onOkClicked);
    connect(ui->pb_Cancel, &QPushButton::clicked, this, &NewDeviceFormDialog::onCancelClicked);
    connect(ui->pb_Import, &QPushButton::clicked, this, &NewDeviceFormDialog::browseFile);
    connect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));
}

NewDeviceFormDialog::~NewDeviceFormDialog()
{
    // 关闭数据库
    QSqlDatabase::database().close();
    delete ui;
}

void NewDeviceFormDialog::onOkClicked()
{

}

void NewDeviceFormDialog::onCancelClicked()
{
}

bool NewDeviceFormDialog::openDatabase(const QString &dbName)
{
    // 创建一个 SQLite 数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    // 设置数据库的文件路径
    db.setDatabaseName(dbName);

    // 尝试打开数据库
    if (!db.open())
    {
        // 如果打开失败,输出错误信息
        hloge("Error: Failed to open database! %s",db.lastError().text().toStdString().c_str());
        return false;
    }

    hlogd("Database opened successfully!");

    return true;
}

void NewDeviceFormDialog::browseFile()
{
    //首先断开连接
    disconnect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));

    // 打开文件对话框,选择文件路径
    QString filePath = QFileDialog::getOpenFileName(this, tr("Select Configuration File"), "", tr("Database Files (*.db);;All Files (*.*)"));

    // 如果用户选择了文件,更新 QLineEdit 显示路径
    if (!filePath.isEmpty())
    {
        ui->lineEdit->setText(filePath);
        qDebug() << "Selected file path: " << filePath;

        openDatabase(filePath);

        QSqlQuery query;
        vecCfgTab_SmartDeviceType SmartDeviceTypes;

        // 查询数据
        if (!query.exec("SELECT DISTINCT Description FROM CfgTab_SmartDeviceType ORDER BY TypeID ASC"))
        {
            hloge("Error: Failed to select data! [%s]",query.lastError().text().toStdString().c_str());
        }
        else
        {
            QVector<QString> devs;
            while (query.next())
            {
                QString s = query.value(0).toString();
                devs.push_back(s);
            }

            foreach (QString device, devs)
            {
                QString sql = QString("SELECT * FROM CfgTab_SmartDeviceType where Description = '%1' ORDER BY ProtocolVersion desc LIMIT 1").arg(device);
                if (!query.exec(sql))
                {
                    hloge("Error: Failed to select data! [%s]",query.lastError().text().toStdString().c_str());
                }
                else
                {
                    // 获取列名到 QSqlRecord
                    QSqlRecord record = query.record();
                    while (query.next())
                    {
                        CfgTabSmartDeviceTypeItem smartDeviceTypesItem;
                        smartDeviceTypesItem.TypeID = query.value(record.indexOf("TypeID")).toInt();
                        smartDeviceTypesItem.Description = query.value(record.indexOf("Description")).toString().toStdString();
                        smartDeviceTypesItem.ClassType = query.value(record.indexOf("ClassType")).toInt();
                        smartDeviceTypesItem.PortConfig = query.value(record.indexOf("PortConfig")).toInt();
                        smartDeviceTypesItem.InterfaceType = query.value(record.indexOf("InterfaceType")).toInt();
                        smartDeviceTypesItem.StationType = query.value(record.indexOf("StationType")).toInt();
                        smartDeviceTypesItem.EquipmentCode = query.value(record.indexOf("EquipmentCode")).toInt();
                        smartDeviceTypesItem.EquipmentModel = query.value(record.indexOf("EquipmentModel")).toString().toStdString();
                        smartDeviceTypesItem.Manufacturer = query.value(record.indexOf("Manufacturer")).toString().toStdString();
                        smartDeviceTypesItem.ProtocolVersion = query.value(record.indexOf("ProtocolVersion")).toString().toStdString();
                        smartDeviceTypesItem.SpecialOption = query.value(record.indexOf("SpecialOption")).toString().toStdString();
                        smartDeviceTypesItem.Notes = query.value(record.indexOf("Notes")).toString().toStdString();

                        qDebug() << "Type ID:" << smartDeviceTypesItem.TypeID << ", Description:" << smartDeviceTypesItem.Description.c_str() << ", ProtocolVersion:" << smartDeviceTypesItem.ProtocolVersion.c_str();

                        SmartDeviceTypes.emplace_back(smartDeviceTypesItem);
                    }
                }
            }
        }

        //设置串口模式
        ui->cb_device->setView(new  QListView(this));
        QStandardItemModel* model_baund = new QStandardItemModel(this);

        for (auto it = SmartDeviceTypes.begin(); it != SmartDeviceTypes.end(); it++)
        {
            int id = it->TypeID;
            QString name = QString::fromStdString(it->Description);
            QString a = QString("%1:%2:%3").arg(id).arg(name).arg(QString::fromStdString(it->ProtocolVersion));

            QStandardItem* item = new QStandardItem(a);
            item->setData(id);
            model_baund->appendRow(item);
        }

        ui->cb_device->setModel(model_baund);
        ui->cb_device->setCurrentIndex(2);
    }

    //重新连接槽函数
    connect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));
}

void NewDeviceFormDialog::onComboBoxTextChanged(const QString &text)
{
    qDebug() << "ComboBox text changed to" << text;
}

void NewDeviceFormDialog::InitializeUi()
{
    ui->slave_id->setText("1");

    //设置奇偶校验
    ui->cb_parity->setView(new  QListView(this));

    QStandardItemModel* model_parity = new QStandardItemModel(this);

    vecParityItemData vparity;
    vparity.push_back(std::make_pair(EMS_PARITY_NONE,tr("None")));
    vparity.push_back(std::make_pair(EMS_PARITY_ODD,tr("Odd")));
    vparity.push_back(std::make_pair(EMS_PARITY_EVEN,tr("Even")));

    for (auto it = vparity.begin(); it != vparity.end(); it++)
    {
        int id = it->first;
        QString name = it->second;

        QStandardItem* item = new QStandardItem(name);
        //QVariant var = QVariant::fromValue(data);
        item->setData(id);
        model_parity->appendRow(item);
    }

    ui->cb_parity->setModel(model_parity);

    //设置数据位
    ui->cb_data->setView(new  QListView(this));
    QStandardItemModel* model_databits = new QStandardItemModel(this);
    vecDataBitsItemData vdatabits;
    vdatabits.push_back(std::make_pair(EMS_DATA_8_BITS,tr("8 Data bits")));
    vdatabits.push_back(std::make_pair(EMS_DATA_7_BITS,tr("7 Data bits")));

    for (auto it = vdatabits.begin(); it != vdatabits.end(); it++)
    {
        int id = it->first;
        QString name = it->second;

        QStandardItem* item = new QStandardItem(name);
        item->setData(id);
        model_databits->appendRow(item);
    }

    ui->cb_data->setModel(model_databits);

    //设置数据位
    ui->cb_stop->setView(new  QListView(this));
    QStandardItemModel* model_stopbits = new QStandardItemModel(this);
    vecDataBitsItemData vstopbits;
    vstopbits.push_back(std::make_pair(EMS_1_STOP_BITS,tr("1 Stop bit")));
    vstopbits.push_back(std::make_pair(EMS_2_STOP_BITS,tr("2 Stop bits")));

    for (auto it = vstopbits.begin(); it != vstopbits.end(); it++)
    {
        int id = it->first;
        QString name = it->second;

        QStandardItem* item = new QStandardItem(name);
        item->setData(id);
        model_stopbits->appendRow(item);
    }

    ui->cb_stop->setModel(model_stopbits);

    //设置串口模式
    ui->cb_baund->setView(new  QListView(this));
    QStandardItemModel* model_baund = new QStandardItemModel(this);
    vecBaundItemData vbaund;
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("2400")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("4800")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("9600")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("19200")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("38400")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("57600")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("115200")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("128000")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("153600")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("230400")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("460800")));
    vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("921600")));

    for (auto it = vbaund.begin(); it != vbaund.end(); it++)
    {
        int id = it->first;
        QString name = it->second;

        QStandardItem* item = new QStandardItem(name);
        item->setData(id);
        model_baund->appendRow(item);
    }

    ui->cb_baund->setModel(model_baund);
    ui->cb_baund->setCurrentIndex(2);

    //设置串口类型
    ui->cb_type->setView(new  QListView(this));
    QStandardItemModel* model_type = new QStandardItemModel(this);
    vecPortTypeItemData vporttype;
    vporttype.push_back(std::make_pair(EMS_SERIALPORT_TYPE,tr("Serial Port")));

    for (auto it = vporttype.begin(); it != vporttype.end(); it++)
    {
        int id = it->first;
        QString name = it->second;

        QStandardItem* item = new QStandardItem(name);
        item->setData(id);
        model_type->appendRow(item);
    }

    ui->cb_type->setModel(model_type);

    //设置串口号
    ui->cb_serialport->setView(new  QListView(this));

    QStandardItemModel* model_serialport = new QStandardItemModel(this);

    for (int i=0; i < AppData::getInstance()->SerialPortCount ; i++)
    {
        QString name = AppData::getInstance()->SerialPortPrefix + QString("%1").arg(i);

        QStandardItem* item = new QStandardItem(name);
        //QVariant var = QVariant::fromValue(data);
        item->setData(name);
        model_serialport->appendRow(item);
    }

    ui->cb_serialport->setModel(model_serialport);
}