#include "PhaseWindow.h"
#include "ui_PhaseWindow.h"

#include <iostream>
#include <QTimer>
#include <QDateTime>
#include <QLabel>
#include <QGroupBox>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDesktopWidget>
#include <QThread>

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

    // 无边框
    this->setWindowFlags(Qt::FramelessWindowHint);

    // 窗口大小为占满一屏
    QRect screenRect = QApplication::desktop()->availableGeometry();
    resize(screenRect.width(), screenRect.height());

    // 将窗口移动到左上角
    move(0, 0);
    ui->exitButt->move(screenRect.width() - 80, 10);
    ui->minButt->move(screenRect.width() - 140, 10);
    ui->endButt->move(screenRect.width() - 200, 10);
    ui->startButt->move(screenRect.width() - 260, 10);
    ui->line->setGeometry(0, 59, screenRect.width(), 1);

    // 设置主体区域的大小和位置
    ui->scrollArea->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60);
    ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    httpReq = new HttpRequestController(this);
    // 1. 获取访问接口需要的token
    int retCode = this->initHttpToken();
    if (retCode != 200)
    {
        QMessageBox::information(this, "错误", "获取http请求的token失败，程序即将退出");

        QTimer::singleShot(1000, qApp, SLOT(quit()));
    }
    // 2. 获取字典值：设备类型
    retCode = this->initDictDeviceTypes();

    // 3. 获取比相仪设备列表
    QJsonObject devListRes = this->initDeviceList();
    if (devListRes.find("code")->toInt() == 200)
    {
        ui->devSelect->clear();

        // 4. 将获取到的设备添加到下拉列表框中
        QJsonArray devArray = devListRes.find("data")->toArray();
        for (int i = 0; i < devArray.size(); i++)
        {
            QJsonObject devItem = devArray.at(i).toObject();
            ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString());

            PhaseDevice * device = new PhaseDevice(this);
            deviceList.append(device);

            device->setComName(devItem.find("linkComName")->toString());
            device->setBaudRate(SettingConfig::getInstance().BAUD_RATE);
            device->setDevCode(devItem.find("deviceNo")->toString());
            device->setDeviceId(devItem.find("deviceId")->toString());

            connect(device, &PhaseDevice::sendDataToDraw,
                    this, &PhaseWindow::drawPhaseDataOnPage);

            device->initSerialPort();

            QThread::msleep(100);
            device->startWork();
        }
        // 5. 设置下拉框的样式
        QStandardItemModel * model = qobject_cast<QStandardItemModel*>(ui->devSelect->model());
        for (int i = 0; i < model->rowCount(); ++i)
        {
            QStandardItem * item = model->item(i);
            item->setSizeHint({ 0, 30 });
        }
    }

    // 6. 绘制一个设备的多个通道数据面板
    this->generateWidgetForDevice();

    HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT);
}

PhaseWindow::~PhaseWindow()
{
    delete ui;
}

void PhaseWindow::drawPhaseDataOnPage(PhaseDataDto * phaseData)
{
    // 当前显示的设备编号
    QString currentDevCode = ui->devSelect->currentData().toString();

    // 如果不是当前设备的帧，直接返回
    if (phaseData->devCode != currentDevCode)
    {
        return;
    }

    // 更新所有通道BOX的值
    for (int i = 0; i < phaseData->channelActive.size(); i++)
    {
        // 获取对应的通道BOX
        QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1);

        // 赋值，对应的lineEdit/label
        ((QLineEdit *)channelBox->children().at(2))->setText(phaseData->timestamp);
        ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(phaseData->channelDataStr.at(i)));
        ((QLineEdit *)channelBox->children().at(6))->setText(phaseData->frameId);
        ((QLabel *)channelBox->children().at(7))->setText(phaseData->channelActive.at(i) == "1" ? "有效" : "无效");
    }
}

void PhaseWindow::generateWidgetForDevice()
{
    // 获取设备数据
    int channelNum = 16;

    QRect screenRect = QApplication::desktop()->screenGeometry();

    ui->scrollContents->setGeometry(0, 60, screenRect.width(), channelNum * 90);

    QVBoxLayout * layout = new QVBoxLayout(ui->scrollContents);
    const QFont labelFont("微软雅黑", 10);

    for (int i = 0; i < channelNum; i++)
    {
        QGroupBox * group = new QGroupBox(ui->scrollContents);
        group->setTitle(QString("通道 - %1").arg(i + 1));
        group->setFont(QFont("微软雅黑", 12));
        group->setGeometry(20, i * 80 + 10, screenRect.width() - 40, 80);

        QHBoxLayout * vbox = new QHBoxLayout(group);

        QLabel * tmLabel = new QLabel();
        tmLabel->setText("时间");
        tmLabel->setFont(labelFont);
        tmLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(tmLabel);
        QLineEdit * tmValue = new QLineEdit();
        tmValue->setFixedWidth(200);
        tmValue->setFont(labelFont);
        vbox->addWidget(tmValue);

        QLabel * dataLabel = new QLabel();
        dataLabel->setText("测量数据");
        dataLabel->setFont(labelFont);
        dataLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(dataLabel);
        QLineEdit * dataValue = new QLineEdit();
        dataValue->setFixedWidth(250);
        dataValue->setFont(labelFont);
        vbox->addWidget(dataValue);

        QLabel * idLabel = new QLabel();
        idLabel->setText("数据ID");
        idLabel->setFont(labelFont);
        idLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(idLabel);
        QLineEdit * idValue = new QLineEdit();
        idValue->setFixedWidth(100);
        idValue->setFont(labelFont);
        vbox->addWidget(idValue);

        QLabel * validLabel = new QLabel();
        validLabel->setText("-");
        validLabel->setFont(labelFont);
        validLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(validLabel);

        QSpacerItem * hSpace = new QSpacerItem(20, 20);
        hSpace->changeSize(20, 20, QSizePolicy::Expanding);
        vbox->addItem(hSpace);

        group->setLayout(vbox);

        layout->addWidget(group);
    }
}

int PhaseWindow::initHttpToken()
{
    QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID,
                                                       SettingConfig::getInstance().APP_KEY);
    return response.find("code")->toInt();
}
int PhaseWindow::initDictDeviceTypes()
{
    QJsonObject response = httpReq->initDictDeviceType();
    return response.find("code")->toInt();
}
QJsonObject PhaseWindow::initDeviceList()
{
    QJsonObject response = httpReq->initDeviceList(SettingConfig::getInstance().DEV_TYPES, SettingConfig::getInstance().SYSTEM);
    return response;
}

void PhaseWindow::on_minButt_clicked()
{
    setWindowState(Qt::WindowMinimized | windowState());
}

void PhaseWindow::on_exitButt_clicked()
{
    QApplication::exit(0);
}

void PhaseWindow::on_startButt_clicked()
{
    int devSelected = ui->devSelect->currentIndex();
    PhaseDevice * device = deviceList.at(devSelected);
    device->startWork();
}

void PhaseWindow::on_endButt_clicked()
{
    int devSelected = ui->devSelect->currentIndex();
    PhaseDevice * device = deviceList.at(devSelected);
    device->stopWork();
}

void PhaseWindow::on_devSelect_currentIndexChanged(int index)
{
    // 清空显示的数据
    if (ui->scrollContents->children().size() < 1)
    {
        return ;
    }

    for (int i = 0; i < 16; i++)
    {
        // 获取对应的通道BOX
        QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1);

        // 赋值，对应的lineEdit/label
        ((QLineEdit *)channelBox->children().at(2))->setText("");
        ((QLineEdit *)channelBox->children().at(4))->setText("");
        ((QLineEdit *)channelBox->children().at(6))->setText("");
        ((QLabel *)channelBox->children().at(7))->setText("-");
    }
}
