#include "tcp.h"
#include "ui_tcp.h"


tcp::tcp(QWidget *parent, scope *pageScope) : QMainWindow(parent),
                                              ui(new Ui::tcp),
                                              page_scope(pageScope) // 初始化 scope
{
    ui->setupUi(this);
    ui->port->setText("8899");
    setWindowTitle("tcp设置");
    connectNum = 0;
    ui->disconnect->setDisabled(true);
    ui->sendMsg->setEnabled(true);
    // 创建监听的服务器对象
    ms = new QTcpServer(this);
    connect(ms, &QTcpServer::newConnection, this, [=]()
            {
                QTcpSocket *clientSocket = ms->nextPendingConnection();
                mstatus->setPixmap(QPixmap(":/accessibility.svg").scaled(20, 20));

                ui->disconnect->setEnabled(true);

                // 将客户端连接添加到连接管理中
                connectedClients[clientSocket] = "";

                // 增加处理连接的信号和槽
                connectClient(clientSocket); });

    // 状态栏处理动作
    mstatus = new QLabel;
    // mstatus->setPixmap(QPixmap(qrc:/accessibility.svg).scaled(20,20));
    ui->statusbar->addWidget(new QLabel("是否有用户连接:"));
    ui->statusbar->addWidget(mstatus);
}

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

void tcp::on_setListen_clicked()
{
    unsigned short port = ui->port->text().toUShort(); // 获取端口号
    ms->listen(QHostAddress::Any, port);               // 监听所有地址上的指定端口
    ui->setListen->setDisabled(true);                  // 禁用监听按钮
    page_scope->Chart_Init();                          // 使用 page_scope 指针调用方法
    page_scope->show();
    this->hide();                                  // 隐藏本窗口
}

void tcp::connectClient(QTcpSocket *clientSocket)
{
    connectNum++;
    connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
            {

        ui->usermsg->append("matlab发送信息");
        QByteArray data = clientSocket->readAll();
        if (data.isEmpty())
            return;

        char dataType = data.at(0);  // 读取前缀
        data.remove(0, 1);  // 移除前缀

        if (dataType == 'T') {
            // 处理文本数据
            QString message = QString::fromUtf8(data);
            ui->record->append("收到文本: " + message);
        } else if (dataType == 'D')  {
            // 处理数字数据
        QVector<QPointF> receivedData;
        int dataSize = data.size() / sizeof(double);


        for (int i = 0; i < dataSize; ++i) {
            double value;
            memcpy(&value, data.data() + i * sizeof(double), sizeof(double));
            if (i>0)
            { 
            page_scope->DrawLine(value);
            }// 绘制曲线解释代码:
            receivedData.append(QPointF(i, value));
        }

        QString numbers;
        for (const QPointF& point : receivedData) {
            numbers += QString::number(point.y(), 'f', 6) + " ";
        }


        QString dataSizeStr = QString::number(dataSize);
        ui->record->append("收到数据长度: " + dataSizeStr + "  数据: " + numbers.trimmed());
        ui->msg->append(numbers.trimmed());
        
        on_sendMsg_clicked();
        

        data.clear();  // 清空 data
        } });

    connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
            {
        clientSocket->close();
        connectedClients.remove(clientSocket);
        connectNum = 0;

        // 更新状态栏
        if (connectNum == 0) {
            mstatus->setPixmap(QPixmap(":/chat-bubble-xmark.svg").scaled(20, 20));
            ui->usermsg->append("matlab断开连接");
        } }); 
        
}

// 接受TCP传输的文件

void tcp::receiveFile(const QString &filename, const QByteArray &data)
{
    QString savePath = "./" + filename;
    QFile file(savePath);
    if (file.open(QIODevice::WriteOnly)) {
        // 进行Base64解码
        QByteArray decodedData = QByteArray::fromBase64(data);

        // 将解码后的数据写入文件
        file.write(decodedData);

        file.close();
        ui->record->append("成功接收到文件: " + filename);


    } 
}

void tcp::on_sendMsg_clicked() // 接受输入的消息并 发送消息
{
    
    // 发送数字1

    // QByteArray data;
    // data.append('1');
    // for (auto clientSocket : connectedClients.keys())
    // {
    //     // 遍历所有连接的客户端
    //     if (clientSocket->state() == QAbstractSocket::ConnectedState)
    //     {
    //         clientSocket->write(data); // 发送数据
    //     }
    // }


    // 发送ui->msg里面输入的文本
    QString msg = ui->msg->toPlainText();  // 获取要发送的消息
    QString serverMsg =  'D'+msg;  // 添加服务器标识
    for (auto clientSocket : connectedClients.keys()) {
        if (clientSocket->state() == QAbstractSocket::ConnectedState) {
            clientSocket->write(serverMsg.toUtf8());  // 发送消息
        }
    }
    ui->record->append("服务端广播消息: " + msg);  // 在记录中显示发送的消息

    // 清空消息框
    ui->msg->clear();
}