#include "commandwidget.h"

#include "ui_commandwidget.h"
#include <QIntValidator>
#include "utils/switchbutton.h"

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

    m_commandUdpSocket = new QUdpSocket(this);
    // 将套接字绑定到指定端口
    if (m_commandUdpSocket->bind(QHostAddress::Any, 1200)) {
        qDebug() << "UDP 套接字已绑定到端口 1200";
    } else {
        qDebug() << "绑定 UDP 套接字失败";
    }

    //创建自定义套接字
    m_CUdpSocket = new CUdpSocket(this);
    initmUdpParam();
}

CommandWidget::~CommandWidget() {
    delete ui;
    if (m_commandUdpSocket) m_commandUdpSocket->deleteLater();
}

void CommandWidget::receiveMessageSlots(QString message, int type) {
    emit sendErrorMessage(message, type);
}

unsigned char CommandWidget::getCrc(quint8 *data, quint8 length) {
    quint16 crc = 0;
    int i = 0;
    while (length-- > 0) {
        crc = CRC8TAB[crc ^ (data[i] & 0x00FF)];

        i++;
    }

    return crc & 0x00ff;
}

ProtocalKB CommandWidget::EncodeCommandCmd(quint8 cmd) {
    std::unique_ptr<ProtocalKB> pBuff = std::make_unique<ProtocalKB>();
    pBuff->head[0] = PROTOCOL_HEAD_0;
    pBuff->head[1] = PROTOCOL_HEAD_1;
    pBuff->reserved = PROTOCOL_RESERVED;
    pBuff->data[0] = cmd;
    pBuff->data[1] = cmd;
    pBuff->data[2] = cmd;
    pBuff->curPage = PROTOCOL_CUR_PAGE;
    quint8 *ptr = reinterpret_cast<quint8 *>(&pBuff);
    pBuff->CHKSUM = getCrc(ptr, sizeof(pBuff) - sizeof(pBuff->CHKSUM));

    return *pBuff;
}

bool CommandWidget::writeBufferToClient(const QByteArray &data) {
    // 目标地址和端口
    QHostAddress destination("172.10.1.216");  // 目标 IP 地址
    quint16 port = 9003;                       // 目标端口

    // 发送数据
    qint64 bytesSent =
        m_commandUdpSocket->writeDatagram(data, destination, port);
    if (bytesSent == -1) {
        qDebug() << "发送失败:" << m_commandUdpSocket->errorString();
        return false;
    } else {
        qDebug() << "发送成功,字节数:" << bytesSent;
        return true;
    }
}

void CommandWidget::buttonResponse(quint8 cmd) {
    ProtocalKB packet = EncodeCommandCmd(cmd);
    // 将 ProtocalKB 结构体转换为 QByteArray
    QByteArray data;
    data.append(reinterpret_cast<const char *>(&packet), sizeof(ProtocalKB));
    for (int i = 0; i < 3; i++) {
        writeBufferToClient(data);
    }
}

void CommandWidget::receiveUavTypeIndex(int index)
{
    switch (index)
    {
    case FP98:
        ui->cmdStackedWidget->setCurrentWidget(ui->stackedWidgetPage1);
        break;
    case MEDICAL_UNIVERSITY:
        ui->cmdStackedWidget->setCurrentWidget(ui->stackedWidgePage2);
        break;
    default:
        break;
    }
}

void CommandWidget::on_pushButton_clicked() {
    buttonResponse(0x75);
}

void CommandWidget::on_pushButton_2_clicked() {
    buttonResponse(0x76);
}

void CommandWidget::on_pushButton_5_clicked() {
    buttonResponse(0x7D);
}

void CommandWidget::on_pushButton_6_clicked() {
    buttonResponse(0x7C);
}

void CommandWidget::on_pushButton_10_clicked() {
    buttonResponse(0x69);
}

void CommandWidget::on_pushButton_9_clicked() {
    buttonResponse(0x6A);
}

void CommandWidget::on_pushButton_4_clicked() {
    buttonResponse(0x77);
}

void CommandWidget::on_pushButton_3_clicked() {
    buttonResponse(0x78);
}

void CommandWidget::on_pushButton_14_clicked() {
    buttonResponse(0x79);
}

void CommandWidget::on_pushButton_13_clicked() {
    buttonResponse(0xC6);
}

void CommandWidget::on_pushButton_17_clicked() {
    buttonResponse(0x66);
}

void CommandWidget::on_pushButton_8_clicked() {
    buttonResponse(0x67);
}

void CommandWidget::on_pushButton_7_clicked() {
    buttonResponse(0x68);
}

void CommandWidget::on_pushButton_12_clicked() {
    buttonResponse(0x7B);
}

void CommandWidget::on_pushButton_11_clicked() {
    buttonResponse(0x7A);
}

void CommandWidget::on_pushButton_16_clicked() {
    buttonResponse(0xC8);
}

void CommandWidget::on_pushButton_15_clicked() {
    buttonResponse(0xC9);
}


/** 武汉天进吊舱 */
void CommandWidget::on_pushButton_left_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), 
        m_protocolPodTJ.cmdLeft(ui->cmdSlider->value())));
}


void CommandWidget::on_pushButton_left_released()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), 
        QByteArray::fromHex("00000000")));
}


void CommandWidget::on_pushButton_right_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), 
        m_protocolPodTJ.cmdRight(ui->cmdSlider->value())));
}


void CommandWidget::on_pushButton_right_released()
{
    on_pushButton_left_released();
}


void CommandWidget::on_pushButton_up_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), 
        m_protocolPodTJ.cmdUp(ui->cmdSlider->value())));
}


void CommandWidget::on_pushButton_up_released()
{
    on_pushButton_left_released();
}

void CommandWidget::on_pushButton_down_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), 
        m_protocolPodTJ.cmdDown(ui->cmdSlider->value())));
}

void CommandWidget::on_pushButton_down_released()
{
    on_pushButton_left_released();
}


void CommandWidget::on_pushButton_center_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7100")));
}


void CommandWidget::on_pushButton_guid_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7200"), 
        m_protocolPodTJ.digitalGuid(ui->guidLineEdit->text().toInt(), ui->poseLineEdit->text().toInt())));
}


void CommandWidget::on_pushButton_pose_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7C00"),
        m_protocolPodTJ.digitalGuid(ui->guidLineEdit->text().toInt(), ui->poseLineEdit->text().toInt())));
}


void CommandWidget::on_pushButton_directL_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7A00")));
}


void CommandWidget::on_pushButton_directS_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7B00")));
}


void CommandWidget::on_pushButton_lookDown_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7300")));
}


void CommandWidget::on_pushButton_packUp_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7400")));
}

void CommandWidget::on_pushButton_scanning_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7900")));
}


void CommandWidget::on_pushButton_close_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7500")));
}

void CommandWidget::on_comboBox1_activated(int index)
{
    if (index >= 0)
    {
        QByteArray data = ui->comboBox1->currentData().toByteArray();
        //qDebug() << data.toHex();
        m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("2300"),data));
    }
}

void CommandWidget::on_comboBox2_activated(int index)
{
    if (index >= 0)
    {
        QByteArray data = ui->comboBox2->currentData().toByteArray();
        //qDebug() << data.toHex();
        m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("2500"), data));

    }
}

void CommandWidget::on_pushButton_videoSwitch_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3100")));
}

void CommandWidget::on_pushButton_video_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3300")));
}

void CommandWidget::on_pushButton_photo_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3200")));
}

void CommandWidget::on_pushButton_zoomp_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"),
        m_protocolPodTJ.cmdZoom(0x01,ui->comboBox3->currentIndex())));
}

void CommandWidget::on_pushButton_zoomp_released()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500")));
}

void CommandWidget::on_pushButton_zoomd_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"),
        m_protocolPodTJ.cmdZoom(0x02, ui->comboBox3->currentIndex())));
}

void CommandWidget::on_pushButton_zoomd_released()
{
    on_pushButton_zoomp_released();
}

void CommandWidget::on_pushButton_focusP_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"),
        m_protocolPodTJ.cmdZoom(0x03, ui->comboBox3->currentIndex())));
}

void CommandWidget::on_pushButton_focusP_released()
{
    on_pushButton_zoomp_released();
}

void CommandWidget::on_pushButton_focusD_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"),
        m_protocolPodTJ.cmdZoom(0x04, ui->comboBox3->currentIndex())));
}

void CommandWidget::on_pushButton_focusD_released()
{
    on_pushButton_zoomp_released();
}

void CommandWidget::on_pushButton_auto_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"),
        m_protocolPodTJ.cmdZoom(0x05, 0x00)));
}

void CommandWidget::on_pushButton_auto_released()
{
    on_pushButton_zoomp_released();
}

void CommandWidget::on_pushButton_contrastP_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), 
        QByteArray::fromHex("01010000")));
}

void CommandWidget::on_pushButton_contrastD_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), 
        QByteArray::fromHex("01020000")));
}

void CommandWidget::on_pushButton_lightP_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), 
        QByteArray::fromHex("02010000")));
}

void CommandWidget::on_pushButton_lightD_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), 
        QByteArray::fromHex("02020000")));
}

void CommandWidget::on_comboBox4_activated(int index)
{
    if (index >= 0)
    {
        QByteArray data = ui->comboBox4->currentData().toByteArray();
        //qDebug() << data.toHex();
        m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4A00"), data));
    }
}

void CommandWidget::on_pushButton_zoomp_2_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), 
        QByteArray::fromHex("0F000000")));
}

void CommandWidget::on_pushButton_zoomp_2_released()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), 
        QByteArray::fromHex("00000000")));
}

void CommandWidget::on_pushButton_zoomd_2_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), 
        QByteArray::fromHex("10000000")));
}

void CommandWidget::on_pushButton_zoomd_2_released()
{
    on_pushButton_zoomp_2_released();
}

void CommandWidget::on_pushButton_contrastP_2_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5A00")));
}

void CommandWidget::on_pushButton_contrastD_2_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5A00"), 
        QByteArray::fromHex("01000000")));
}

void CommandWidget::on_pushButton_color_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5300")));
}

void CommandWidget::on_comboBox5_activated(int index)
{
    if (index >= 0)
    {
        QByteArray data = ui->comboBox5->currentData().toByteArray();
        m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5300"), data));
    }
}

void CommandWidget::on_pushButton_distance_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3D00")));
}

void CommandWidget::on_pushButton_distanceC_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3E00"),
        m_protocolPodTJ.cmdLaser(ui->comboBox6->currentIndex() + 1)));
}

void CommandWidget::on_pushButton_distanceS_pressed()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3F00")));
}

void CommandWidget::on_cmdLineEdit_textChanged(const QString text)
{
    qDebug() << text;
    if (text.toInt() < 10)//数据小于10不响应
    {
        return;
    }
    ui->cmdSlider->setMaximum(text.toInt());
}

void CommandWidget::setPodIPConfig(NetworkIPStruct networkIP, bool isConnect)
{
    qDebug() << "ip设置槽函数调用了";

    if (!isConnect) 
    {
        m_CUdpSocket->close();
        return; 
    }

    if (m_CUdpSocket->close())
    {
        if (!m_CUdpSocket->bind(networkIP.localIP, networkIP.localPort))
        {
            qDebug() << "端口号绑定失败";
        }

        //绑定目标IP Port
        m_CUdpSocket->setTargetInfo(networkIP.remoteIP, networkIP.remotePort);
    }

}

void CommandWidget::setMoveParm(QPointF size)
{
    int x = std::clamp(static_cast<int>(size.x() / 10), -60, 60);
    int y = std::clamp(static_cast<int>(-size.y() / 10), -60, 60);
    qDebug() << "缩减之后的屏幕滑动参数==>" << "x:" << x << "y:" << y;

    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"),
        m_protocolPodTJ.cmdServo(x, y)));
}


void CommandWidget::stopServo()
{
    on_pushButton_left_released();
}

void CommandWidget::setTargetTracking(double dir, double pitch)
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3A00"),
        m_protocolPodTJ.targetTracking(static_cast<int>(std::round(dir)), static_cast<int>(std::round(pitch)))));
}

void CommandWidget::setStopTracking()
{
    m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3B00")));
}

/***武汉天进吊舱控制***/
void CommandWidget::initmUdpParam()
{
    if (!m_CUdpSocket->bind("172.10.0.249", 10001))
    {
        qDebug() << "端口号绑定失败";
    }

    //绑定目标IP Port
    m_CUdpSocket->setTargetInfo("172.10.0.249", 10000);

    QIntValidator* validator = new QIntValidator(0, 100, this);
    ui->cmdLineEdit->setValidator(validator);
    ui->cmdLineEdit->setText("40");
    ui->cmdSlider->setValue(20);

    //AI开关
    connect(ui->switchButton1, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff){
        if (onOroff) //开关打开
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("9100"), 
                QByteArray::fromHex("01000000")));
        }
        else
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("9100")));
        }
    });

    ui->comboBox1->addItem("16 * 16", QByteArray::fromHex("01000000"));
    ui->comboBox1->addItem("32 * 32", QByteArray::fromHex("02000000"));
    ui->comboBox1->addItem("64 * 64", QByteArray::fromHex("03000000"));
    ui->comboBox1->addItem("128 * 128", QByteArray::fromHex("04000000"));

    ui->comboBox2->addItem("红外", QByteArray::fromHex("00000000"));
    ui->comboBox2->addItem("可见光", QByteArray::fromHex("01000000"));
    ui->comboBox2->addItem("上下分屏", QByteArray::fromHex("02000000"));
    ui->comboBox2->addItem("画中画1", QByteArray::fromHex("03000000"));
    ui->comboBox2->addItem("画中画2", QByteArray::fromHex("04000000"));
    ui->comboBox2->addItem("左右分屏", QByteArray::fromHex("05000000"));

    ui->comboBox3->setCurrentIndex(4);

    //低照度
    connect(ui->btn_light, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff) {
        if (onOroff) //开关打开
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4B00"), 
                QByteArray::fromHex("01000000")));
        }
        else
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4B00")));
        }
    });

    //电子稳像
    connect(ui->btn_stable, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff) {
        if (onOroff) //开关打开
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), 
                QByteArray::fromHex("04010000")));
        }
        else
        {
            m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"),
                QByteArray::fromHex("04020000")));
        }
    });

    //图像去雾
    ui->comboBox4->addItem("关", QByteArray::fromHex("00000000"));
    ui->comboBox4->addItem("低", QByteArray::fromHex("01000000"));
    ui->comboBox4->addItem("中", QByteArray::fromHex("02000000"));
    ui->comboBox4->addItem("强", QByteArray::fromHex("03000000"));

    //伪彩选择
    ui->comboBox5->addItem("白热", QByteArray::fromHex("01000000"));
    ui->comboBox5->addItem("黑热", QByteArray::fromHex("01010000"));
    ui->comboBox5->addItem("蓝红黄", QByteArray::fromHex("01020000"));
    ui->comboBox5->addItem("紫红黄", QByteArray::fromHex("01030000"));
    ui->comboBox5->addItem("蓝绿红", QByteArray::fromHex("01040000"));
    ui->comboBox5->addItem("彩虹1", QByteArray::fromHex("01050000"));
    ui->comboBox5->addItem("彩虹2", QByteArray::fromHex("01060000"));
    ui->comboBox5->addItem("黑-红", QByteArray::fromHex("01070000"));
    ui->comboBox5->addItem("墨绿-红", QByteArray::fromHex("01080000"));
    ui->comboBox5->addItem("蓝绿红-粉", QByteArray::fromHex("01090000"));
    ui->comboBox5->addItem("混合色", QByteArray::fromHex("010A0000"));
    ui->comboBox5->addItem("红头", QByteArray::fromHex("010B0000"));
}