#include "ChartsAndCamerasWnd.h"
#include "ui_ChartsAndCamerasWnd.h"
#include <QSettings>
#include <QCloseEvent>
#include <QVBoxLayout>
#include <QTimer>
#include "chartline.h"
#include <QRandomGenerator>
#include <QScrollBar>
#include <qDebug>
#include "CameraMaterialGroupWnd/CameraImage/CameraImageHandler.h"
#include <QPixmap>
#include <QFileDialog>
#include <QDateTime>
#include <QMessageBox>
#include <QPen>

ChartsAndCamerasWnd::ChartsAndCamerasWnd(QWidget* parent) :
    JOriginalMainWnd(parent),
    ui(new Ui::ChartsAndCamerasWnd),
    chartLine(new ChartLine(this)),
    chartLine1(new ChartLine(this)),
    chartLine2(new ChartLine(this))
{
    ui->setupUi(this);



    // 设置 ChartLine 的位置和大小
    chartLine->setParent(ui->Leftwidget);
    chartLine->setGeometry(0, 0, 560, 280);
    chartLine->setChartLabels("Combined Placement", "Number of Samples", "Device Align");

    // 设置 ChartLine1 的位置和大小
    chartLine1->setParent(ui->Leftwidget);
    chartLine1->setGeometry(0, 245, 560, 280);
    chartLine1->setChartLabels("Y placement", "Number of samples", "Y device align");

    // 设置 ChartLine2 的位置和大小
    chartLine2->setParent(ui->Leftwidget);
    chartLine2->setGeometry(0, 490, 560, 280);
    chartLine2->setChartLabels("Theta placement", "Number of samples", "Theta device align");

    // 初始化系列信息
    initializeSeriesInfo();

    // 连接所有复选框的 clicked 信号到通用槽函数
    QList<QCheckBox*> checkBoxes = {
        ui->GreenDiamondcheckBox,
        ui->YellowDiamondcheckBox,
        ui->BlackDiamondcheckBox,
        ui->BlueDiamondcheckBox,
        ui->BlueHorizontalLinecheckBox,
        ui->BlueVerticalBarcheckBox,
        ui->GreenVerticalBarcheckBox,
        ui->PurpleVerticalBarcheckBox,
        ui->RedDiamondcheckBox,
        ui->RedHorizontalLinecheckBox,
        ui->WhiteVerticalBarcheckBox
    };

    for (QCheckBox* cb : checkBoxes) {
        cb->setCheckable(true);

        //connect(cb, &QCheckBox::clicked, this, &ChartsAndCamerasWnd::on_CheckBox_clicked);
    }


    //isEnable = false;
    // initFrom();
    isShow = true;
}

ChartsAndCamerasWnd::~ChartsAndCamerasWnd()
{
    m_pMainCameraBind = nullptr;
    delete ui;
    UnCameraBind();
}





void ChartsAndCamerasWnd::initializeSeriesInfo()
{
    // 初始化系列信息,使用 DataSeries 结构体
    m_seriesMap["GreenDiamond"] = DataSeries{
        "GreenDiamond",
        QColor("#00FF00"), // 绿色
        QPixmap(":/images/Participation display/GreenDiamond.png"),
        QList<QPointF>() // 初始为空
    };

    m_seriesMap["YellowDiamond"] = DataSeries{
        "YellowDiamond",
        QColor("#FFFF00"), // 黄色
        QPixmap(":/images/Participation display/YellowDiamond.png"),
        QList<QPointF>()
    };

    m_seriesMap["BlackDiamond"] = DataSeries{
        "BlackDiamond",
        QColor("#000000"), // 黑色
        QPixmap(":/images/Participation display/BlackDiamond.png"),
        QList<QPointF>()
    };

    m_seriesMap["BlueDiamond"] = DataSeries{
        "BlueDiamond",
        QColor("#0000FF"), // 蓝色
        QPixmap(":/images/Participation display/BlueDiamond.png"),
        QList<QPointF>()
    };

    m_seriesMap["BlueHorizontalLine"] = DataSeries{
        "BlueHorizontalLine",
        QColor("#0000FF"),
        QPixmap(":/images/Participation display/Blue_horizontal_line.png"),
        QList<QPointF>()
    };

    m_seriesMap["BlueVerticalBar"] = DataSeries{
        "BlueVerticalBar",
        QColor("#0000FF"),
        QPixmap(":/images/Participation display/Blue_vertical_bar.png"),
        QList<QPointF>()
    };

    m_seriesMap["GreenVerticalBar"] = DataSeries{
        "GreenVerticalBar",
        QColor("#00FF00"),
        QPixmap(":/images/Participation display/Green_vertical_bar.png"),
        QList<QPointF>()
    };

    m_seriesMap["PurpleVerticalBar"] = DataSeries{
        "PurpleVerticalBar",
        QColor("#800080"),
        QPixmap(":/images/Participation display/Purple_vertical_bar.png"),
        QList<QPointF>()
    };

    m_seriesMap["RedDiamond"] = DataSeries{
        "RedDiamond",
        QColor("#FF0000"), // 红色
        QPixmap(":/images/Participation display/RedDiamond.png"),
        QList<QPointF>()
    };

    m_seriesMap["RedHorizontalLine"] = DataSeries{
        "RedHorizontalLine",
        QColor("#FF0000"),
        QPixmap(":/images/Participation display/Red_horizontal_line.png"),
        QList<QPointF>()
    };

    m_seriesMap["WhiteVerticalBar"] = DataSeries{
        "WhiteVerticalBar",
        QColor("#FFFFFF"), // 白色
        QPixmap(":/images/Participation display/White_vertical_bar.png"),
        QList<QPointF>()
    };
}



#if 0
void ChartsAndCamerasWnd::on_CheckBox_clicked()
{
    // 获取发送信号的复选框
    QCheckBox* checkBox = qobject_cast<QCheckBox*>(sender());
    if (!checkBox)
        return;

    QString checkBoxName = checkBox->objectName();
    QString seriesName = checkBoxName;

    // 移除末尾的 "checkBox"
    if (seriesName.endsWith("checkBox")) {
        seriesName.chop(QString("checkBox").length());
    }
    else if (seriesName.endsWith("CheckBox")) {
        seriesName.chop(QString("CheckBox").length());
    }

    qDebug() << "Checkbox clicked:" << seriesName << (checkBox->isChecked() ? "Checked" : "Unchecked");

    if (!m_seriesMap.contains(seriesName)) {
        qDebug() << "No series info for:" << seriesName;
        return;
    }

    DataSeries& seriesInfo = m_seriesMap[seriesName];

    if (checkBox->isChecked()) {
        // 生成随机数据
        QList<QPointF> data;
        for (int i = 0; i <= 40; i += 4) {
            data.append(QPointF(i, QRandomGenerator::global()->bounded(-30, 80)));
        }
        seriesInfo.data = data;

        // 添加到 ChartLine 实例
        chartLine->addDataSeries(seriesInfo);
        chartLine1->addDataSeries(seriesInfo);
        chartLine2->addDataSeries(seriesInfo);
        qDebug() << "Added series:" << seriesName;
    }
    else {
        // 从 ChartLine 实例中移除
        chartLine->removeDataSeries(seriesName);
        chartLine1->removeDataSeries(seriesName);
        chartLine2->removeDataSeries(seriesName);
        qDebug() << "Removed series:" << seriesName;
    }
}
#endif

void ChartsAndCamerasWnd::initFrom() {


    QWidget* viewport = ui->scrollArea->viewport();
    QWidget* container = new QWidget(viewport);
    QHBoxLayout* layout = new QHBoxLayout(container);

    layout->setSpacing(16); // 设置Group之间的间隔距离
    layout->setMargin(0);

    //QList<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int nSize = 0;
    if (m_pMainCameraBind != nullptr)
    {
        nSize = m_pMainCameraBind->m_vecCamera.size();
        if (nSize == 0) // 针对获取不到的情况
        {
            nSize = 5;
            //JMessageTip::Message_warning("a");
        }
        QList<int> numbers;

        for (int i = 1; i <= nSize; i++)
        {
            numbers.push_back(i);
        }
        for (int i = 0; i < numbers.size(); ++i)
        {
            int num = numbers[i];
            CameraImageHandler* manager = new CameraImageHandler(num);
            Group* widget = manager->getGroup();
            //connect(widget,&Group::send_button_Signal,this,&ChartsAndCamerasWnd::showAndHide);
            if (widget != nullptr)
            {
                CameraConnectUpdateImageFun(i, widget);

                layout->addWidget(widget);
                m_allGroup.append(widget);
            }
            if (manager->getWafer())
            {
                waferMap.insert(num, manager->getWafer());
            }
            if (manager->getWaffle())
            {
                waffleMap.insert(num, manager->getWaffle());
            }
            if (manager->getMaterialBox())
            {
                materialBoxMap.insert(num, manager->getMaterialBox());
            }
            if (manager->getBond()) {
                bondMap.insert(num, manager->getBond());
            }

            delete manager;
        }

        // 设置控件的最小高度和最大宽度
        int minHeight = 162;
        int maxWidth = 244;
        int num = -16;
        for (Group* w : m_allGroup) {
            w->setMinimumHeight(minHeight);
            w->setMaximumWidth(maxWidth);
            num = num + 260;
        }

        container->setMinimumSize(num, 162);
        container->setLayout(layout);
        ui->scrollArea->setWidget(container);
        ui->scrollArea->resize(508, 177);
        initWidget();

    }
}


void ChartsAndCamerasWnd::checkSettings(int groupId, int index) {

    if (groupId != lastGroupId || index != lastIndex) {

        GetCurrentSelectSlots(groupId, index);
        lastGroupId = groupId;
        lastIndex = index;
        saveInfoOfLast();

    }
}


void ChartsAndCamerasWnd::updateMaterialWidget(int materialWndType, int groupId) {

    switch (materialWndType) {
    case 1: ui->viewwidgetgroup->setWafer(waferMap.value(groupId)); break;
    case 2: ui->viewwidgetgroup->setWaffle(waffleMap.value(groupId)); break;
    case 3: ui->viewwidgetgroup->setMaterialBox(materialBoxMap.value(groupId)); break;
    case 4: ui->viewwidgetgroup->setBond(bondMap.value(groupId)); break;
    }

}


void ChartsAndCamerasWnd::InitMainCameraBind(CameraBind* pCameraBind)
{
    m_pMainCameraBind = pCameraBind;
    initFrom();
}

void ChartsAndCamerasWnd::UnCameraBind()
{
    for (size_t i = 0; i < m_allGroup.size(); i++)
    {
        CameraConnectUpdateImageFun(i, m_allGroup[i], true);
    }
    //判断退出前的窗口是否是绑定相机
    if (m_veCurrentSelectGroup.isBond == true) {
        //解绑
        disconnect(m_veCurrentSelectGroup.pSelectGroup, &Group::SetUpDataImageShowSig,
            this, &ChartsAndCamerasWnd::GetGroupImageShowSignals);
    }
}

void ChartsAndCamerasWnd::UpdateCameraDisplay0(int iCameraId, JVision::ImageInfo imageData)
{
    QImage image(imageData.data, imageData.width, imageData.height, QImage::Format_Indexed8);
    emit UpDataImageShowSignals0(QPixmap::fromImage(image));
}

void ChartsAndCamerasWnd::UpdateCameraDisplay1(int iCameraId, JVision::ImageInfo imageData)
{
    QImage image(imageData.data, imageData.width, imageData.height, QImage::Format_Indexed8);
    emit UpDataImageShowSignals1(QPixmap::fromImage(image));
}

void ChartsAndCamerasWnd::UpdateCameraDisplay2(int iCameraId, JVision::ImageInfo imageData)
{
    QImage image(imageData.data, imageData.width, imageData.height, QImage::Format_Indexed8);
    emit UpDataImageShowSignals2(QPixmap::fromImage(image));
}

void ChartsAndCamerasWnd::UpdateCameraDisplay3(int iCameraId, JVision::ImageInfo imageData)
{
    QImage image(imageData.data, imageData.width, imageData.height, QImage::Format_Indexed8);
    emit UpDataImageShowSignals3(QPixmap::fromImage(image));
}

void ChartsAndCamerasWnd::UpdateCameraDisplay4(int iCameraId, JVision::ImageInfo imageData)
{
    QImage image(imageData.data, imageData.width, imageData.height, QImage::Format_Indexed8);
    emit UpDataImageShowSignals4(QPixmap::fromImage(image));
}

void ChartsAndCamerasWnd::CameraConnectUpdateImageFun(int nIndex, Group* widget, bool isUnCameraBind /*= false*/)
{
    auto BinCamerasImage = [&](void (ChartsAndCamerasWnd::* pCamerasImage)(const QPixmap& imageData))
    {
        if (isUnCameraBind)
        {
            //disconnect(widget, &Group::SetCurrentSelectSig, this, &ChartsAndCamerasWnd::GetCurrentSelectSlots);
            disconnect(this, pCamerasImage, widget, &Group::UpDataImageShowSlots);
        }
        else
        {
            //共用函数
            //connect(widget, &Group::sendUpdateGroupState, this, &ChartsAndCamerasWnd::checkSettings);
            connect(this, pCamerasImage, widget, &Group::UpDataImageShowSlots);
        }

    };

    if (nIndex == 0)
    {
        BinCamerasImage(&ChartsAndCamerasWnd::UpDataImageShowSignals0);
    }
    else if (nIndex == 1)
    {
        BinCamerasImage(&ChartsAndCamerasWnd::UpDataImageShowSignals1);
    }
    else if (nIndex == 2)
    {
        BinCamerasImage(&ChartsAndCamerasWnd::UpDataImageShowSignals2);
    }
    else if (nIndex == 3)
    {
        BinCamerasImage(&ChartsAndCamerasWnd::UpDataImageShowSignals3);
    }
    else if (nIndex == 4)
    {
        BinCamerasImage(&ChartsAndCamerasWnd::UpDataImageShowSignals4);
    }
}

void ChartsAndCamerasWnd::wheelEvent(QWheelEvent* event)
{
    //mousePos = ui->viewwidgetgroup->getOperatewidget()->mapFromGlobal(event->globalPos());

    //if (ui->viewwidgetgroup->getOperatewidget()->rect().contains(ui->viewwidgetgroup->getOperatewidget()->mapFromGlobal(event->globalPos()))) {
    //    if (event->angleDelta().y() > 0) {
    //        ui->viewwidgetgroup->updateScale(scaleFactor * 1.1); // 放大
    //    } else {
    //        ui->viewwidgetgroup->updateScale(scaleFactor * 0.9); // 缩小
    //    }
    //}
    //if (ui->scrollArea->rect().contains(ui->scrollArea->mapFromGlobal(event->globalPos()))) {
    //    // 获取 QScrollArea 的横向滚动条
    //    QScrollBar *scrollBar = ui->scrollArea->horizontalScrollBar();
    //    // 根据滚轮滚动方向改变滚动条的值
    //    if (event->angleDelta().y() > 0) {
    //        scrollBar->setValue(scrollBar->value() - 50);
    //    } else {
    //        scrollBar->setValue(scrollBar->value() + 50);
    //    }
    //}

    QMainWindow::wheelEvent(event);
}

void ChartsAndCamerasWnd::showEvent(QShowEvent* event) {
    QMainWindow::showEvent(event);
    // loadSettings();
    // initFrom();
}

void ChartsAndCamerasWnd::hideEvent(QHideEvent* event) {
    QMainWindow::hideEvent(event);
}

void ChartsAndCamerasWnd::GetGroupImageShowSignals(const QPixmap& imageData) {
    QSize size = ui->viewwidgetgroup->getOperatewidget()->size();
    QPixmap scaledPixmap = imageData.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui->viewwidgetgroup->setScaleFactorSize(scaledPixmap);
    // m_lastRightPixmap = imageData;
}

void ChartsAndCamerasWnd::BindImageOrMaterial(int index) {

    if (index == m_nImageIndex) {

        m_veCurrentSelectGroup.isBond = true;
        connect(m_veCurrentSelectGroup.pSelectGroup, &Group::SetUpDataImageShowSig,
            this, &ChartsAndCamerasWnd::GetGroupImageShowSignals);
        UpdataLightJoystickSwitchPage(m_veCurrentSelectGroup.pSelectGroup->m_nGroupId, true);

    }
    else {
        QSettings settings("YourOrganization", "YourApplication");
        settings.beginGroup(QString::number(m_veCurrentSelectGroup.pSelectGroup->m_nGroupId));
        int materialWndType = settings.value("MaterialWndType").toInt();
        settings.endGroup();
        m_veCurrentSelectGroup.isBond = false;
        UpdataLightJoystickSwitchPage(m_veCurrentSelectGroup.pSelectGroup->m_nGroupId, false);
        updateMaterialWidget(materialWndType, m_veCurrentSelectGroup.pSelectGroup->m_nGroupId);

    }

}

void ChartsAndCamerasWnd::initWidget() {
    //初始化当前页面的信息

    QSettings settings("YourOrganization", "YourApplication");
    lastIndex = settings.value("ChartLastIndex", 1).toInt();
    lastGroupId = settings.value("ChartLastGroupId", 1).toInt();

    //处理各种情况的初始化
    if (m_pMainCameraBind == nullptr || m_allGroup.size() == 0)
    {
        return;
    }

    //当lastGroupId大于m_allGroup.size()时,初始化lastGroupId为1
    if (m_allGroup.size() < lastGroupId) {

        lastGroupId = 1;
        lastIndex = 1;
        m_veCurrentSelectGroup.isInitialed = true;
        m_veCurrentSelectGroup.pSelectGroup = m_allGroup.at(lastGroupId - 1);

        BindImageOrMaterial(m_nImageIndex);

    }
    else {
    }
    m_veCurrentSelectGroup.isInitialed = true;
    m_veCurrentSelectGroup.pSelectGroup = m_allGroup.at(lastGroupId - 1);
    if (lastIndex == 1) {

        BindImageOrMaterial(m_nImageIndex);

    }
    else {

        BindImageOrMaterial(m_nMaterialIndex);

    }

}

void ChartsAndCamerasWnd::saveInfoOfLast() {
    QSettings settings("YourOrganization", "YourApplication");
    settings.setValue("ChartLastIndex", lastIndex);
    settings.setValue("ChartLastGroupId", lastGroupId);
}

void ChartsAndCamerasWnd::GetCurrentSelectSlots(int groupId, int nIndex) {
    int nOnClickGroupId = groupId - 1;
    if (m_pMainCameraBind == nullptr || m_allGroup.size() < groupId)
    {
        return;
    }

    //判断更新前的窗口是否是绑定相机
    if (m_veCurrentSelectGroup.isBond == true) {
        //解绑
        disconnect(m_veCurrentSelectGroup.pSelectGroup, &Group::SetUpDataImageShowSig,
            this, &ChartsAndCamerasWnd::GetGroupImageShowSignals);
    }
    //判断index是相机还是物料
    if (nIndex == 2) {

        m_veCurrentSelectGroup.pSelectGroup = m_allGroup.at(nOnClickGroupId);
        BindImageOrMaterial(m_nMaterialIndex);

    }
    else if (nIndex == 1) {
        m_veCurrentSelectGroup.pSelectGroup = m_allGroup.at(nOnClickGroupId);
        BindImageOrMaterial(m_nImageIndex);
    }
}

void ChartsAndCamerasWnd::UpdataLightJoystickSwitchPage(int groupId, bool isShow)
{
    auto Fun = [&](Group* pGroup, LightJoystickSwitchPage* p, ControlOperationPage* pContPage, bool bShow)
    {
        p->UpdatemPageGroup(pGroup);
        p->InitMainCameraBind(m_pMainCameraBind, bShow);
        p->HideOrShowPage(bShow);
        if (bShow)
        {
            pContPage->UpDateCameraBind(m_pMainCameraBind);
        }
        else
        {
            pContPage->setSwitchJoystickButEnable(bShow);
        }

    };


    disconnect(ui->viewwidgetgroup, &ControlOperationPage::SendModuleTypeSignals,
        ui->control, &LightJoystickSwitchPage::GetModuleTypeSlots);
    Group* currGroup = m_allGroup.at(groupId - 1);
    Fun(currGroup, ui->control, ui->viewwidgetgroup, isShow);
    connect(ui->viewwidgetgroup, &ControlOperationPage::SendModuleTypeSignals,
        ui->control, &LightJoystickSwitchPage::GetModuleTypeSlots);


}