#include "addspecialitem.h"
#include "ui_addspecialitem.h"

#include <memory>
#include <QDebug>
#include <QListView>

#include "globalinfo.h"
#include "ExecPlan.h"
#include "customcombobox.h"

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

    /* 设置无边框 */
    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
    /* 设置底层样式表,让最底层的透明 */
    this->setAttribute(Qt::WA_TranslucentBackground);

    m_logger = spdlog::get("ExecPlan");
    if(nullptr == m_logger)
    {
        qDebug() << "ExecPlan获取logger失败";
    }

    /* 设置QSS */
    QFile file(":/qss/qss/PageExecPlan/AddSpecialItem.qss");
    if(file.open(QFile::ReadOnly))
    {
        QString styleSheet = tr(file.readAll());
        ui->widget_background->setStyleSheet(styleSheet);
        file.close();
    } else
    {
        SPDLOG_LOGGER_ERROR(m_logger,"打开文件失败:{}", file.fileName().toStdString());
    }

    /* 设置combobox下拉框阴影 */
    ui->comBox_actionSelect->setViewShadowEffect();
    ui->comBox_devSelect->setViewShadowEffect();


    /* 获取父指针 */
    m_p = dynamic_cast<ExecPlan*>(parent);
    m_date = QDate::currentDate();

    m_loop = new QEventLoop(this);

    /* 设置遮罩 */
    ui->widget->setStyleSheet(R"(Background: rgba(0, 0, 0, 0.4);)");

    /* 设置样式 */
    // ui->timeEdit->setStyleSheet(R"(
    //     TimeWidget
    //     {
    //         background: #FFFFFF;
    //         border-radius: 4px;
    //         border: 1px solid #E6E9F4;
    //         padding-left:12px;
    //         color: #858EBD;
    //     }
    //     )");
    // ui->dateEdit->setStyleSheet(R"(
    //     CalendarDTEdit
    //         {
    //             padding-left:8px;
    //             background: #FFFFFF;
    //             border-radius: 4px;
    //             border: 1px solid #E6E9F4;
    //         }
    //         CalendarDTEdit::drop-down
    //         {
    //             padding-right:8px;
    //             width: 16px;
    //             image: url(:/ESM-8C_ICON/Date.png);
    //         }
    //     )");


    ui->timeEdit->setTimeAreaWidth(132);
    ui->timeEdit->SetMainWindow(this);
    ui->timeEdit->setTime("00:00:00");
    ui->dateEdit->setDisplayFormat("yyyy-MM-dd");
    ui->dateEdit->setDate(QDate::currentDate());

    // ui->label_dateWarn->hide();
    ui->label_timeWarn->hide();
    ui->label_devWarn->hide();
    ui->label_actionWarn->hide();

    /* 添加设备项 */
    ui->comBox_devSelect->clear();
    for(const auto& it : DevInfo.cfgDevInfo())
    {
        ui->comBox_devSelect->addItem(it->devName);
        for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++)
        {
            ui->comBox_actionSelect->addItem(it1.value());
        }
    }
    ui->comBox_devSelect->setCurrentIndex(0);
    m_devName = ui->comBox_devSelect->currentText();
    /* 添加动作项 */
    ui->comBox_actionSelect->clear();
    auto it = DevInfo.cfgDevInfo().value(ui->comBox_devSelect->currentText(),nullptr);
    if(nullptr != it )
    {
        for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++)
        {
            ui->comBox_actionSelect->addItem(it1.value());
        }
    }

    /* 连接信号和槽 */
    connect(ui->pBtn_Close,&QPushButton::clicked,this,&AddSpecialItem::do_close);
    connect(ui->pBtn_cancel,&QPushButton::clicked,this,&AddSpecialItem::do_close);
    connect(ui->pBtn_ok,&QPushButton::clicked,this,&AddSpecialItem::do_ok);

    /* 设备选择 */
    connect(ui->comBox_devSelect,QOverload<const QString&>::of(&QComboBox::currentTextChanged),this,[this](){
        m_devName = ui->comBox_devSelect->currentText();
        /* 根据选择的设备,设置该设备的动作 */
        ui->comBox_actionSelect->clear();
        auto it = DevInfo.cfgDevInfo().value(ui->comBox_devSelect->currentText(),nullptr);
        if(nullptr != it )
        {
            /* 将该设备支持的动作设置到选项中 */
            for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++)
            {
                ui->comBox_actionSelect->addItem(it1.value());
            }
        }
    });
    /* 动作选择 */
    connect(ui->comBox_actionSelect,QOverload<const QString&>::of(&QComboBox::currentTextChanged),this,[this](){
        m_action = ui->comBox_actionSelect->currentText();
    });
//    connect(ui->pBtn_selectTime,SIGNAL(clicked()),this,SLOT(do_selectTime()));
//    connect(ui->pBtn_selectDate,SIGNAL(clicked()),this,SLOT(do_selectDate()));

}

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

/* 选择时间 */
//void AddSpecialItem::do_selectTime()
//{
//    auto ct =std::make_shared<CustomTimeEdit>(this);

//    /* 出现在框的下面,pBtn_timeStart的坐标是相对于AddNormalTime这个弹框的 */
//    int x = this->x()+ui->pBtn_selectTime->x();
//    int y = this->y() + ui->pBtn_selectTime->y()+32;
//    ct->move(x,y);
//    /* 设置当前显示的时间 */
//    ct->setValue(QTime(0,0,0));
//    /* 选择结束后的信号和槽 */
//    connect(ct.get(),&CustomTimeEdit::signal_timeChanged,this,[this](QTime t){
//        ui->pBtn_selectTime->setText(t.toString());
//        m_time = t;
//    });
//    ct->exec();
//}
/* 选择日期 */
//void AddSpecialItem::do_selectDate()
//{
//    CDate ce(this);
//    /* 设置出现位置 */
//    int x = this->x() + ui->pBtn_selectDate->x();
//    int y = this->y() + ui->pBtn_selectDate->y() + 32;
//    ce.move(x,y);

//    /* 选择结束后的信号和槽 */
//    connect(&ce,&CDate::signal_DateChanged,[&](QDate date){
//        ui->pBtn_selectDate->setText(date.toString("yyyy-MM-dd"));
//        m_date = date;
//        m_loop->quit();
//    });
//    ce.show();
//    m_loop->exec();
//}
/* 进行查重和关闭页面 */
void AddSpecialItem::do_ok()
{
    ui->label_timeWarn->hide();
    ui->label_devWarn->hide();
    ui->label_actionWarn->hide();
    setComboBoxWarning(ui->comBox_devSelect,false);
    setComboBoxWarning(ui->comBox_actionSelect, false);
    setTimeEditWarning(false);

    /* 检查设备是否为空 */
    if(ui->comBox_devSelect->currentText().isEmpty())
    {
        ui->label_devWarn->setText("不能为空!");
        ui->label_devWarn->show();
        setComboBoxWarning(ui->comBox_devSelect, true);
        return;
    }
    /* 检查动作是否为空 */
    if(ui->comBox_actionSelect->currentText().isEmpty())
    {
        ui->label_actionWarn->setText("不能为空!");
        ui->label_actionWarn->show();
        setComboBoxWarning(ui->comBox_actionSelect, false);
    }

    /* 时间和日期赋值 */
    m_time = ui->timeEdit->getFormTime();
    m_date = ui->dateEdit->date();
    /* 检查时间是否为空 */
    if(m_time.isNull())
    {
        ui->label_timeWarn->setText("时间为空");
        ui->label_timeWarn->show();
        setTimeEditWarning(true);
        return;
    }
    /* 进行设备查重 */
    bool ret = m_p->judgeDateTimeRepetition(*m_p->m_vecItem[m_p->m_stack->currentIndex()],m_devName,m_date,m_time);
    if(ret)
    {
        ui->label_timeWarn->setText("设备和执行时间重复");
        ui->label_timeWarn->show();
        setTimeEditWarning(true);
        return;
    }

    /* 发送信号 */
    emit signal_AddSpecialItem(m_devName,m_action,m_date,m_time);
    if(m_loop->isRunning())
    {
        m_loop->quit();
    }
    close();
}
/* 在这个函数里检查loop否退出 */
void AddSpecialItem::do_close()
{
    if(m_loop->isRunning())
    {
        m_loop->quit();
    }
    this->close();
}

/* 设置选择框报警 */
void AddSpecialItem::setComboBoxWarning(QComboBox* bo, bool flag)
{
    if(flag)
    {
        bo->setProperty("Warn", true);
    }
    else
    {
        bo->setProperty("Warn", false);
    }

    bo->style()->unpolish(bo);
    bo->style()->polish(bo);
    
}

/* 设置时间报警 */
void AddSpecialItem::setTimeEditWarning(bool flag)
{
    if(flag)
    {
        ui->timeEdit->setProperty("Warn", true);
    }
    else
    {
        ui->timeEdit->setProperty("Warn", false);
    }

    ui->timeEdit->style()->unpolish(ui->timeEdit);
    ui->timeEdit->style()->polish(ui->timeEdit);
}