#include <QtDebug>

#include "experimentsettingform.h"
#include "ui_experimentsettingform.h"
#include "protocol.h"
#include "dataparser.h"
#include "serialport.h"
#include "global.h"
#include "filemanager.h"

QString extractObjectName(const QString& fullObjectName) {
    return fullObjectName.mid(4);  // 去掉前 4 个字符（"ui->"）
}

#define SET_OBJECT_NAME(WIDGET) \
    WIDGET->setObjectName(extractObjectName(#WIDGET))

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

    connect(ui->checkBox_phase_2, &QCheckBox::clicked,
            this, &ExperimentSettingForm::slotPhase2StateChanged);
    connect(ui->checkBox_phase_3, &QCheckBox::clicked,
            this, &ExperimentSettingForm::slotPhase3StateChanged);
    connect(ui->checkBox_phase_4, &QCheckBox::clicked,
            this, &ExperimentSettingForm::slotPhase4StateChanged);
    connect(ui->checkBox_phase_5, &QCheckBox::clicked,
            this, &ExperimentSettingForm::slotPhase5StateChanged);
    connect(ui->checkBox_phase_6, &QCheckBox::clicked,
            this, &ExperimentSettingForm::slotPhase6StateChanged);

    //    connect(ui->pushButton_connect_to_device,&QPushButton::clicked,
    //            this,&ExperimentSettingForm::slotConnectToDevice);
    connect(ui->pushButton_cancel, &QPushButton::clicked,
            this, &ExperimentSettingForm::slotCancel);
}

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

void ExperimentSettingForm::uiReset()
{
    // init data and status.
    ui->checkBox_phase_1->setChecked(true);
    ui->checkBox_phase_1->setEnabled(false);

    ui->phase_1_cutoff_temp->setText("0");
    ui->phase_2_cutoff_temp->setText("0");
    ui->phase_3_cutoff_temp->setText("0");
    ui->phase_4_cutoff_temp->setText("0");
    ui->phase_5_cutoff_temp->setText("0");
    ui->phase_6_cutoff_temp->setText("0");

    ui->phase_1_scan_rate->setText("0");
    ui->phase_2_scan_rate->setText("0");
    ui->phase_3_scan_rate->setText("0");
    ui->phase_4_scan_rate->setText("0");
    ui->phase_5_scan_rate->setText("0");
    ui->phase_6_scan_rate->setText("0");

    ui->phase_1_constant_temp->setText("0");
    ui->phase_2_constant_temp->setText("0");
    ui->phase_3_constant_temp->setText("0");
    ui->phase_4_constant_temp->setText("0");
    ui->phase_5_constant_temp->setText("0");
    ui->phase_6_constant_temp->setText("0");
    //
    ui->phase_2_cutoff_temp->setEnabled(false);
    ui->phase_3_cutoff_temp->setEnabled(false);
    ui->phase_4_cutoff_temp->setEnabled(false);
    ui->phase_5_cutoff_temp->setEnabled(false);
    ui->phase_6_cutoff_temp->setEnabled(false);

    ui->phase_2_scan_rate->setEnabled(false);
    ui->phase_3_scan_rate->setEnabled(false);
    ui->phase_4_scan_rate->setEnabled(false);
    ui->phase_5_scan_rate->setEnabled(false);
    ui->phase_6_scan_rate->setEnabled(false);

    ui->phase_2_constant_temp->setEnabled(false);
    ui->phase_3_constant_temp->setEnabled(false);
    ui->phase_4_constant_temp->setEnabled(false);
    ui->phase_5_constant_temp->setEnabled(false);
    ui->phase_6_constant_temp->setEnabled(false);

    ui->comboBox_phase_2_atmosphere->setEnabled(false);
    ui->comboBox_phase_3_atmosphere->setEnabled(false);
    ui->comboBox_phase_4_atmosphere->setEnabled(false);
    ui->comboBox_phase_5_atmosphere->setEnabled(false);
    ui->comboBox_phase_6_atmosphere->setEnabled(false);

    ui->radioButton_OIT_not->setChecked(true);

    ui->checkBox_phase_2->setTristate(false);
    ui->checkBox_phase_3->setTristate(false);
    ui->checkBox_phase_4->setTristate(false);
    ui->checkBox_phase_5->setTristate(false);
    ui->checkBox_phase_6->setTristate(false);

    //set objectName
    SET_OBJECT_NAME(ui->checkBox_phase_1);
    SET_OBJECT_NAME(ui->checkBox_phase_2);
    SET_OBJECT_NAME(ui->checkBox_phase_3);
    SET_OBJECT_NAME(ui->checkBox_phase_4);
    SET_OBJECT_NAME(ui->checkBox_phase_5);
    SET_OBJECT_NAME(ui->checkBox_phase_6);

    SET_OBJECT_NAME(ui->phase_1_cutoff_temp);
    SET_OBJECT_NAME(ui->phase_2_cutoff_temp);
    SET_OBJECT_NAME(ui->phase_3_cutoff_temp);
    SET_OBJECT_NAME(ui->phase_4_cutoff_temp);
    SET_OBJECT_NAME(ui->phase_5_cutoff_temp);
    SET_OBJECT_NAME(ui->phase_6_cutoff_temp);

    SET_OBJECT_NAME(ui->phase_1_scan_rate);
    SET_OBJECT_NAME(ui->phase_2_scan_rate);
    SET_OBJECT_NAME(ui->phase_3_scan_rate);
    SET_OBJECT_NAME(ui->phase_4_scan_rate);
    SET_OBJECT_NAME(ui->phase_5_scan_rate);
    SET_OBJECT_NAME(ui->phase_6_scan_rate);

    SET_OBJECT_NAME(ui->phase_1_constant_temp);
    SET_OBJECT_NAME(ui->phase_2_constant_temp);
    SET_OBJECT_NAME(ui->phase_3_constant_temp);
    SET_OBJECT_NAME(ui->phase_4_constant_temp);
    SET_OBJECT_NAME(ui->phase_5_constant_temp);
    SET_OBJECT_NAME(ui->phase_6_constant_temp);

    SET_OBJECT_NAME(ui->comboBox_phase_1_atmosphere);
    SET_OBJECT_NAME(ui->comboBox_phase_2_atmosphere);
    SET_OBJECT_NAME(ui->comboBox_phase_3_atmosphere);
    SET_OBJECT_NAME(ui->comboBox_phase_4_atmosphere);
    SET_OBJECT_NAME(ui->comboBox_phase_5_atmosphere);
    SET_OBJECT_NAME(ui->comboBox_phase_6_atmosphere);

    SET_OBJECT_NAME(ui->radioButton_OIT_not);
    SET_OBJECT_NAME(ui->comboBox_initial_atmosphere);
}

void ExperimentSettingForm::uiSetPhaseEnable(const int index)
{
    switch (index) {
    case 1:
        ui->checkBox_phase_1->setTristate(true);
        ui->phase_1_cutoff_temp->setEnabled(true);
        ui->phase_1_scan_rate->setEnabled(true);
        ui->phase_1_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    case 2:
        ui->checkBox_phase_2->setTristate(true);
        ui->phase_2_cutoff_temp->setEnabled(true);
        ui->phase_2_scan_rate->setEnabled(true);
        ui->phase_3_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    case 3:
        ui->checkBox_phase_1->setTristate(true);
        ui->phase_1_cutoff_temp->setEnabled(true);
        ui->phase_1_scan_rate->setEnabled(true);
        ui->phase_1_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    case 4:
        ui->checkBox_phase_1->setTristate(true);
        ui->phase_1_cutoff_temp->setEnabled(true);
        ui->phase_1_scan_rate->setEnabled(true);
        ui->phase_1_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    case 5:
        ui->checkBox_phase_1->setTristate(true);
        ui->phase_1_cutoff_temp->setEnabled(true);
        ui->phase_1_scan_rate->setEnabled(true);
        ui->phase_1_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    case 6:
        ui->checkBox_phase_1->setTristate(true);
        ui->phase_1_cutoff_temp->setEnabled(true);
        ui->phase_1_scan_rate->setEnabled(true);
        ui->phase_1_constant_temp->setEnabled(true);
        ui->comboBox_phase_1_atmosphere->setEnabled(true);
        break;
    default:
        break;
    }
}

void ExperimentSettingForm::slotPhase2StateChanged(int state)
{
    qDebug() << "slotPhase2StateChanged:" << state;

    if (state == Qt::PartiallyChecked)
    {
        ui->phase_2_cutoff_temp->setEnabled(true);
        ui->phase_2_scan_rate->setEnabled(true);
        ui->phase_2_constant_temp->setEnabled(true);
        ui->comboBox_phase_2_atmosphere->setEnabled(true);
    }
    else
    {
        if (ui->checkBox_phase_3->isChecked())
        {
            ui->checkBox_phase_2->setCheckState(Qt::Checked);
        }
        else
        {
            ui->phase_2_cutoff_temp->setEnabled(false);
            ui->phase_2_scan_rate->setEnabled(false);
            ui->phase_2_constant_temp->setEnabled(false);
            ui->comboBox_phase_2_atmosphere->setEnabled(false);
        }
    }
}

void ExperimentSettingForm::slotPhase3StateChanged(int state)
{
    if (state == Qt::PartiallyChecked)
    {
        if (ui->checkBox_phase_2->isChecked())
        {
            ui->phase_3_cutoff_temp->setEnabled(true);
            ui->phase_3_scan_rate->setEnabled(true);
            ui->phase_3_constant_temp->setEnabled(true);
            ui->comboBox_phase_3_atmosphere->setEnabled(true);
        }
        else
        {
            ui->checkBox_phase_3->setChecked(false);
        }
    }
    else
    {
        if (ui->checkBox_phase_4->isChecked())
        {
            ui->checkBox_phase_3->setChecked(true);
        }
        else
        {
            ui->phase_3_cutoff_temp->setEnabled(false);
            ui->phase_3_scan_rate->setEnabled(false);
            ui->phase_3_constant_temp->setEnabled(false);
            ui->comboBox_phase_3_atmosphere->setEnabled(false);
        }
    }
}

void ExperimentSettingForm::slotPhase4StateChanged(int state)
{
    if (state == Qt::PartiallyChecked)
    {
        if (ui->checkBox_phase_3->isChecked())
        {
            ui->phase_4_cutoff_temp->setEnabled(true);
            ui->phase_4_scan_rate->setEnabled(true);
            ui->phase_4_constant_temp->setEnabled(true);
            ui->comboBox_phase_4_atmosphere->setEnabled(true);
        }
        else
        {
            ui->checkBox_phase_4->setChecked(false);
        }
    }
    else
    {
        ui->phase_4_cutoff_temp->setEnabled(false);
        ui->phase_4_scan_rate->setEnabled(false);
        ui->phase_4_constant_temp->setEnabled(false);
        ui->comboBox_phase_4_atmosphere->setEnabled(false);
    }
}

void ExperimentSettingForm::slotPhase5StateChanged(int state)
{
    if (state == Qt::PartiallyChecked)
    {
        if (ui->checkBox_phase_4->isChecked())
        {
            ui->phase_5_cutoff_temp->setEnabled(true);
            ui->phase_5_scan_rate->setEnabled(true);
            ui->phase_5_constant_temp->setEnabled(true);
            ui->comboBox_phase_5_atmosphere->setEnabled(true);
        }
        else
        {
            ui->checkBox_phase_5->setChecked(false);
        }
    }
    else
    {
        ui->phase_5_cutoff_temp->setEnabled(false);
        ui->phase_5_scan_rate->setEnabled(false);
        ui->phase_5_constant_temp->setEnabled(false);
        ui->comboBox_phase_5_atmosphere->setEnabled(false);
    }
}

void ExperimentSettingForm::slotPhase6StateChanged(int state)
{
    if (state == Qt::PartiallyChecked)
    {
        if (ui->checkBox_phase_5->isChecked())
        {
            ui->phase_6_cutoff_temp->setEnabled(true);
            ui->phase_6_scan_rate->setEnabled(true);
            ui->phase_6_constant_temp->setEnabled(true);
            ui->comboBox_phase_6_atmosphere->setEnabled(true);
        }
        else
        {
            ui->checkBox_phase_6->setChecked(false);
        }
    }
    else
    {
        ui->phase_6_cutoff_temp->setEnabled(false);
        ui->phase_6_scan_rate->setEnabled(false);
        ui->phase_6_constant_temp->setEnabled(false);
        ui->comboBox_phase_6_atmosphere->setEnabled(false);
    }
}

void ExperimentSettingForm::slotConnectToDevice()
{
    QVector<Phase> phaseVtr;
    if (ui->checkBox_phase_1->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_1_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_1_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_1_constant_temp->text().toInt();
        //        phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }
    if (ui->checkBox_phase_2->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_2_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_2_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_2_constant_temp->text().toInt();
        //        phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }

    if (ui->checkBox_phase_3->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_3_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_3_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_3_constant_temp->text().toInt();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }
    if (ui->checkBox_phase_4->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_4_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_4_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_4_constant_temp->text().toInt();
        //        phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }
    if (ui->checkBox_phase_5->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_5_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_5_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_5_constant_temp->text().toInt();
        //        phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }
    if (ui->checkBox_phase_6->checkState())
    {
        Phase phase;
        phase.onoff = 1;
        phase.cutoff_temp = ui->phase_6_cutoff_temp->text().toFloat();
        phase.temp_flow = ui->phase_6_scan_rate->text().toFloat();
        phase.constant_temp_time_min = (uint16_t)ui->phase_6_constant_temp->text().toInt();
        //        phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
        phase.gas = GasType::N2;

        phaseVtr.push_back(phase);
    }

    QByteArray ba = DataParser::connectToDevice(phaseVtr);
    qDebug() << "ba size:" << ba.size();
    emit sigDeliverData(ba);

    //    Global::instance()->setMode(Global::Mode::ConnectedToDev);

#if 0
    QByteArray startBa = DataParser::setDeviceStartStop(DeviceStartMode::Start);
    emit sigConnectToDevice(startBa);
#endif

    hide();
}

void ExperimentSettingForm::slotCancel()
{
    hide();
}
void ExperimentSettingForm::slotPhaseCheck()
{
    if (sender() == ui->checkBox_phase_2)
    {
        if (ui->checkBox_phase_2->isChecked())
        {
            ui->phase_2_cutoff_temp->setEnabled(true);
            ui->phase_2_scan_rate->setEnabled(true);
            ui->phase_2_constant_temp->setEnabled(true);
            ui->comboBox_phase_2_atmosphere->setEnabled(true);
        }
        else
        {
            ui->phase_2_cutoff_temp->setEnabled(false);
            ui->phase_2_scan_rate->setEnabled(false);
            ui->phase_2_constant_temp->setEnabled(false);
            ui->comboBox_phase_2_atmosphere->setEnabled(false);
        }
    }
    else if (sender() == ui->checkBox_phase_3)
    {
        if (ui->checkBox_phase_3->isChecked())
        {
            ui->phase_3_cutoff_temp->setEnabled(true);
            ui->phase_3_scan_rate->setEnabled(true);
            ui->phase_3_constant_temp->setEnabled(true);
            ui->comboBox_phase_3_atmosphere->setEnabled(true);
        }
        else
        {
            ui->phase_3_cutoff_temp->setEnabled(false);
            ui->phase_3_scan_rate->setEnabled(false);
            ui->phase_3_constant_temp->setEnabled(false);
            ui->comboBox_phase_3_atmosphere->setEnabled(false);
        }
    }
    else if (sender() == ui->checkBox_phase_4)
    {
        if (ui->checkBox_phase_4->isChecked())
        {
            ui->phase_4_cutoff_temp->setEnabled(true);
            ui->phase_4_scan_rate->setEnabled(true);
            ui->phase_4_constant_temp->setEnabled(true);
            ui->comboBox_phase_4_atmosphere->setEnabled(true);
        }
        else
        {
            ui->phase_4_cutoff_temp->setEnabled(false);
            ui->phase_4_scan_rate->setEnabled(false);
            ui->phase_4_constant_temp->setEnabled(false);
            ui->comboBox_phase_4_atmosphere->setEnabled(false);
        }
    }
}

void ExperimentSettingForm::on_pushButton_deliverData_clicked()
{
    slotConnectToDevice();

    FileManager::_expeInfo.sampleName = ui->sampleNameLineEdit->text();
    FileManager::_expeInfo.sampleWeight = ui->sampleWeightLineEdit->text().toInt(nullptr, 16);
    FileManager::_expeInfo.date = ui->dateTimeLineEdit->text();
    FileManager::_expeInfo.userName = ui->userLineEdit->text();
}

void ExperimentSettingForm::slotRecvPhaseInfo(const QByteArray &ba)
{
    QByteArray localba = ba;
    SerialPortProtocol *spp = (SerialPortProtocol *)localba.data();

    u8 *data = spp->data_buf;

    QVector<Phase> phaseVtr;
    for (int i = 0; i < 6; i++)
    {
        Phase *phase = (Phase *)(data + i * PHASE_BYTE_SIZE);
        phaseVtr.push_back(*phase);
    }

    //ui update
    for(int i = 0; i< phaseVtr.size();){
        const Phase &phase = phaseVtr[i];
        if(phase.onoff == 0){
            break;
        }

        i++;
        qDebug()<<"index :"<<i;

        QString checkBoxName = QString("checkBox_phase_%1").arg(i);
        QCheckBox *checkBox_phase = qobject_cast<QCheckBox*>(this->findChild<QObject*>(checkBoxName));
        if (checkBox_phase) {
            checkBox_phase->setChecked(true);
            qDebug()<<"found...";
        }else{
            qDebug()<<"not found...";
        }

        QString cutOffTempLineEditName = QString("phase_%1_cutoff_temp").arg(i);
        QLineEdit *cutOffTempLineEdit = qobject_cast<QLineEdit*>(this->findChild<QObject*>(cutOffTempLineEditName));
        if(cutOffTempLineEdit){
            cutOffTempLineEdit->setText(QString::number(phase.cutoff_temp,'f',3));
            cutOffTempLineEdit->setEnabled(true);
        }

        QString scanRateLineEditName = QString("phase_%1_scan_rate").arg(i);
        QLineEdit *scanRateLineEdit =
                qobject_cast<QLineEdit*>(this->findChild<QObject*>(scanRateLineEditName));
        if(scanRateLineEdit){
            scanRateLineEdit->setText(QString::number(phase.temp_flow,'f',3));
            scanRateLineEdit->setEnabled(true);
        }
        QString constantTempLineEditName = QString("phase_%1_constant_temp").arg(i);
        QLineEdit *constantTempLineEdit =
                qobject_cast<QLineEdit*>(this->findChild<QObject*>(constantTempLineEditName));
        if(constantTempLineEdit){
            constantTempLineEdit->setText(QString::number(phase.constant_temp_time_min));
            constantTempLineEdit->setEnabled(true);
        }
        QString atmoshpereComboBoxName = QString("comboBox_phase_%1_atmosphere").arg(i);
        QComboBox *atmoshpereComboBox =
                qobject_cast<QComboBox*>(this->findChild<QObject*>(atmoshpereComboBoxName));
        if(atmoshpereComboBox){
            qDebug()<<"gas:"<<phase.gas;
            atmoshpereComboBox->setCurrentIndex(phase.gas % 256);
            atmoshpereComboBox->setEnabled(true);
        }
    }
    //
    //    radioButton_OIT_not
    //    radioButton_OIT
    //    comboBox_initial_atmosphere

    u8 *oitValue = data + (ba.size() - 2);
    if(*oitValue){
        QString oitRadioButtonName("radioButton_OIT");
        QRadioButton *oitRadioButton =
                qobject_cast<QRadioButton*>(this->findChild<QObject*>(oitRadioButtonName));
        if(oitRadioButton){
            oitRadioButton->setChecked(true);
        }
    }else{
        QString oitNotRadioButtonName("radioButton_OIT_not");
        QRadioButton *oitNotRadioButton =
                qobject_cast<QRadioButton*>(this->findChild<QObject*>(oitNotRadioButtonName));
        if(oitNotRadioButton){
            oitNotRadioButton->setChecked(true);
        }
    }

    u8 *initAtmosphereValue = data + (ba.size() - 1);
    QString initialAtmosphereComboBoxObjectName("comboBox_initial_atmosphere");
    QComboBox *initialAtmosphereComboBox =
            qobject_cast<QComboBox*>(this->findChild<QObject*>(initialAtmosphereComboBoxObjectName));
    if(initialAtmosphereComboBox){
        initialAtmosphereComboBox->setCurrentIndex(*initAtmosphereValue);
    }


}
