#include "oneitem.h"
#include "ui_oneitem.h"

#include <QFile>

#include "LHQLogAPI.h"
#include "TransmitterSwitchInfo.h"
#include "customcombobox.h"

#include "lhstylemanager.h"

OneItem::OneItem(QWidget *parent, bool isSpecial) :
    QWidget(parent), m_isSpecial(isSpecial),
    ui(new Ui::OneItem)
{
    ui->setupUi(this);

    init();
}

OneItem::OneItem(bool isSpecial) : 
    QWidget(nullptr), m_isSpecial(isSpecial),
    ui(new Ui::OneItem)
{
    ui->setupUi(this);

    init();
}

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


/* 初始化 */
void OneItem::init()
{
    /* 加载QSS */
    // QFile file(":/QSS/QSS/OneItem_dark.qss");
    // if(file.open(QIODevice::ReadOnly))
    // {
    //     QString stylesheet = file.readAll();
    //     this->setStyleSheet(stylesheet);
    //     file.close();
    // } else
    // {
    //     LH_WRITE_ERROR(QString("打开文件失败:%1").arg(file.fileName()));
    // }
    LHStyleManager::Instance()->AddWidget(this);
    /* 设置背景透明 */
    this->setAttribute(Qt::WA_TranslucentBackground);
    /* 设置无边框 */
    this->setWindowFlags(Qt::FramelessWindowHint);

    /* 设置定时器 */
    m_warnTimer.setTimerType(Qt::PreciseTimer);
    m_warnTimer.setSingleShot(true);
    connect(&m_warnTimer, &QTimer::timeout, this, &OneItem::hideWarn);

    /* 初始化变量 */
    m_uuid = QUuid::createUuid();
    setExecTime(QTime(0,0,0));
    setDate(QDate(1970,1,1));


    /* 根据是否是特殊日移动位置 */
    layoutInit();

    /* 设置下拉框背景 */
    ui->comboBox_devName->setViewShadowEffect();
    ui->comboBox_action->setViewShadowEffect();

    /* 注册事件过滤器 */
    ui->comboBox_devName->installEventFilter(this);
    ui->comboBox_action->installEventFilter(this);

    /* 连接信号和槽 */
    connect(ui->comboBox_devName,QOverload<const QString&>::of(&QComboBox::currentTextChanged),this,&OneItem::do_devChanged);
    connect(ui->comboBox_action,QOverload<const QString&>::of(&QComboBox::currentTextChanged),this,&OneItem::do_actionChanged);
    connect(ui->pBtn_execTime,&QPushButton::clicked,this,&OneItem::do_pBtn_execTime_clicked);
    connect(ui->pBtn_iconTime,&QPushButton::clicked,this,&OneItem::do_pBtn_execTime_clicked);
    connect(ui->pBtn_execDate,&QPushButton::clicked,this,&OneItem::do_pBtn_execDate_clicked);
    connect(ui->pBtn_iconDate,&QPushButton::clicked,this,&OneItem::do_pBtn_execDate_clicked);
    connect(ui->pBtn_close, &QPushButton::clicked, this, &OneItem::do_pBtn_close_clicked);
}

/* 设置序号 */
void OneItem::setNum(int num)
{
    m_num = num;
    ui->label_num->setText(QString::number(num));
}

/* 获取序号 */
int OneItem::getNum()
{
    return m_num;
}

/* 设置日期 */
void OneItem::setDate(const QDate& date)
{
    m_date = date;
    ui->pBtn_execDate->setText(date.toString("yyyy-MM-dd"));
}

/* 获取日期 */
QDate OneItem::getDate()
{
    return m_date;
}

/* 设置执行时间 */
void OneItem::setExecTime(const QTime& time)
{
    m_time = time;
    ui->pBtn_execTime->setText(time.toString("hh:mm:ss"));
}

/* 获取执行时间 */
QTime OneItem::getExecTime()
{
    return m_time;
}

/* 设置设备名称 */
void OneItem::setDevName(const QString& dev)
{
    ui->comboBox_devName->setCurrentText(dev);
}

/* 获取设备名称 */
QString OneItem::getDevName()
{
    return ui->comboBox_devName->currentText();
}

/* 添加设备支持的动作 */
void OneItem::addActions()
{
    auto acts = DevTypeContainer.getDevType(m_devInfo.PTTypeCode);
    ui->comboBox_action->clear();
    if(acts.PTTypeCode > 0)
    {
        for(auto it = acts.devAction.begin();it != acts.devAction.end();it++)
        {
            ui->comboBox_action->addItem(it.value(), it.key());
        }
    }
}

/* 获取动作名称 */
QString OneItem::getActionName()
{
    return ui->comboBox_action->currentText();
}

/* 获取动作类型 */
int OneItem::getActionNum()
{
    return ui->comboBox_action->currentIndex();
}

/* 添加设备 */
void OneItem::addDevice()
{
    auto& mapDev = DeviceContainer.getMapDevice();
    ui->comboBox_devName->clear();
    for(const auto& it : mapDev)
    {
        ui->comboBox_devName->addItem(it.devName);
    }
    /* 设置显示第一个设备,并设置可选的动作 */
    ui->comboBox_devName->setCurrentIndex(0);
    addActions();
}

/* 获取日期类型 */
bool OneItem::getDateType()
{
    return m_isSpecial;
}

/* 设置警告 */
void OneItem::setWarningText(QString str, int ms)
{
    ui->label_warnning->setText(str);
    ui->label_warnning->show();
    if(ms > 0)
    {
        m_warnTimer.start(ms);
    }
    /* 设置红框 */
    ui->pBtn_execTime->setProperty("Warn",true);
    ui->pBtn_execTime->style()->unpolish(ui->pBtn_execTime);
    ui->pBtn_execTime->style()->polish(ui->pBtn_execTime);
    ui->pBtn_execDate->setProperty("Warn",true);
    ui->pBtn_execDate->style()->unpolish(ui->pBtn_execDate);
    ui->pBtn_execDate->style()->polish(ui->pBtn_execDate);
}

/* 隐藏警告 */
void OneItem::hideWarn()
{
    ui->label_warnning->clear();
    /* 取消红框 */
    ui->pBtn_execTime->setProperty("Warn", false);
    ui->pBtn_execTime->style()->unpolish(ui->pBtn_execTime);
    ui->pBtn_execTime->style()->polish(ui->pBtn_execTime);
    ui->pBtn_execDate->setProperty("Warn", false);
    ui->pBtn_execDate->style()->unpolish(ui->pBtn_execDate);
    ui->pBtn_execDate->style()->polish(ui->pBtn_execDate);
}

/* 获取执行时间的位置 */
QPoint OneItem::getExecTimePos()
{
    return ui->pBtn_execTime->pos();
}

/* 获取执行日期的位置 */
QPoint OneItem::getExecDatePos()
{
    return ui->pBtn_execDate->pos();
}

/* 获取执行时间按钮的大小 */
QSize OneItem::getExecTimeSize()
{
    return ui->pBtn_execTime->size();
}

/* 获取执行日期按钮的大小 */
QSize OneItem::getExecDateSize()
{
    return ui->pBtn_execDate->size();
}

/* 设备改变了 */
void OneItem::do_devChanged(QString devName)
{
    /* 根据选择的设备,设置该设备的动作 */
    ui->comboBox_action->clear();
    auto it = DeviceContainer.getDevice(devName);
    if(it.PTTypeCode > 0)
    {
        m_devInfo = it;
        for(auto it1 = m_devInfo.DevType.devAction.begin();it1 != m_devInfo.DevType.devAction.end();it1++)
        {
            ui->comboBox_action->addItem(it1.value(), it1.key());
        }
    }else
    {
        LH_WRITE_ERROR(QString("没有这个设备:%1").arg(devName));
        return;
    }
    emit signal_devChanged();
}

/* 动作改变了 */
void OneItem::do_actionChanged(QString action)
{

}

/* 执行时间被点击了 */
void OneItem::do_pBtn_execTime_clicked()
{
    emit signal_execTimeClicked(getExecTime());
}

/* 执行日期被点击了 */
void OneItem::do_pBtn_execDate_clicked()
{
    emit signal_dateClicked(getDate());
}

/* 关闭按钮被点击了 */
void OneItem::do_pBtn_close_clicked()
{
    emit signal_OneItemDelete(m_weekDay, m_num);
}


/* 根据日期类型布局 */
void OneItem::layoutInit()
{
    /* 正常日,日期隐藏 */
    if(!m_isSpecial)
    {
        ui->pBtn_execDate->hide();
        ui->pBtn_iconDate->hide();
        /* 序号 */
        ui->label_num->move(18, 0);
        /* 设备名称 */
        ui->comboBox_devName->move(114, 0);
        /* 执行时间 */
        ui->pBtn_execTime->move(390, 0);
        /* 执行时间图标 */
        ui->pBtn_iconTime->move(498, 8);
        /* 动作 */
        ui->comboBox_action->move(538, 0);
        /* 关闭 */
        ui->pBtn_close->move(814, 0);
    }else 
    {
        ui->pBtn_execDate->show();
        ui->pBtn_iconDate->show();
        /* 序号 */
        ui->label_num->move(18, 0);
        /* 设备名称 */
        ui->comboBox_devName->move(114, 0);
        /* 执行日期 */
        ui->pBtn_execDate->move(390, 0);
        /* 执行日期图标 */
        ui->pBtn_iconDate->move(498, 8);
        /* 执行时间 */
        ui->pBtn_execTime->move(539, 0);
        /* 执行时间图标 */
        ui->pBtn_iconTime->move(646, 8);
        /* 动作 */
        ui->comboBox_action->move(686, 0);
        /* 关闭 */
        ui->pBtn_close->move(962, 0);
    }
}


/* 事件过滤器 */
bool OneItem::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->comboBox_action)
    {
        if(event->type() == QEvent::Wheel)
        {
            return true;
        }
    }
    else if(watched == ui->comboBox_devName)
    {
        if(event->type() == QEvent::Wheel)
        {
            return true;
        }
    }
    return QWidget::eventFilter(watched,event);
}