#include "VideoPlayer1.h"

#include "videodecode.h"

#include <QPainter>
#include <QResizeEvent>
#include <QEventLoop>
#include <QVBoxLayout>

#include "spdlog/spdlog.h"
#include "FmtLog/fmtlog.h"



VideoPlayer1::VideoPlayer1(QWidget *parent) : QWidget(parent)
{
    m_timerRefreshUI.setSingleShot(false);
    /* 设置精度毫秒级 */
    m_timerRefreshUI.setTimerType(Qt::PreciseTimer);
    connect(&m_timerRefreshUI, &QTimer::timeout, this, &VideoPlayer1::do_refreshUI);
}

VideoPlayer1::~VideoPlayer1()
{
    if(m_timerRefreshUI.isActive())
    {
        m_timerRefreshUI.stop();
    }
    delete m_decodeVedio;
    if(m_image)
    {
        delete m_image;
    }
}

/**
 * @brief 设置播放视频，启动定时器，定时器间隔决定播放的速度
 *        视频的宽和高使用QImage进行缩放
 *        视频大小在直接设置这个类的resize即可，有最小大小限制
 * 
 * @param fileName 
 */
void VideoPlayer1::setPlayVedio(const QString& fileName)
{
    m_decodeVedio = new VideoDecode();
    m_decodeVedio->open(fileName);
    m_fileName = fileName;

    
}

/* 播放视频 */
bool VideoPlayer1::play()
{

    if(m_playStatus)
    {
        return false;
    }
    
    /* 设置刷新时间 */
    m_timerRefreshUI.setSingleShot(false);
    m_interval = 1000/25;
    SPDLOG_TRACE("刷新UI的定时间隔:{}",m_interval);
    m_timerRefreshUI.start(m_interval);
    m_playStatus = true;
    return true;
}

/* 暂停播放 */
void VideoPlayer1::pause()
{
    if(!m_playStatus)
    {
        return;
    }
    m_timerRefreshUI.stop();
    m_playStatus = false;
}

/* 停止播放，停止后停止解码，将时间等复位到开始时间 */
void VideoPlayer1::stop()
{
    SPDLOG_DEBUG("...停止播放...");
    // m_fileName = QString();
    if(m_timerRefreshUI.isActive())
    {
        m_timerRefreshUI.stop();
    }
    // SPDLOG_DEBUG("...停止解码...");
    
    /* 重新设置播放视频 */
    setPlayVedio(m_fileName);

    /* 绘制黑帧 */
    // SPDLOG_DEBUG("绘制黑帧");
    // m_image = new QImage(m_nowWidth, m_nowHeight, QImage::Format_RGB32);
    // m_image->fill(Qt::black);
    // update();
    m_playStatus = false;
    // isSetVedioFile = false;
}




void VideoPlayer1::paintEvent(QPaintEvent *event)
{
    if(m_playStatus)
    {
        SPDLOG_TRACE("开始绘制画面...");
        /* 对图像进行缩放 */
        QImage image = m_decodeVedio->read();
        if(m_srcWidth != m_nowWidth || m_srcHeight != m_nowHeight)
        {
            image = image.scaled(m_nowWidth, m_nowHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
        }
        QPainter painter(this);
        painter.drawImage(0, 0, image);
    }
}

void VideoPlayer1::resizeEvent(QResizeEvent *event)
{
    SPDLOG_TRACE("窗口大小改变...");
    m_nowWidth = event->size().width();
    m_nowHeight = event->size().height();

    /* 传递给解码器 */
    // m_decodeVedio->setVideoSize(m_nowWidth, m_nowHeight);

    QWidget::resizeEvent(event);
}

/* 刷新一张图片，直到有图片为止 */
void VideoPlayer1::refreshOneUIUntilHave()
{
    update();
}


/* 双击事件函数 */
void VideoPlayer1::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        // SPDLOG_DEBUG("双击事件...");
        // if(m_funcPlayCB != nullptr)
        // {
        //     m_funcPlayCB(this, 5, nullptr, 0, m_context);
        // }else {
        //     SPDLOG_INFO("没有设置回调函数");
        // }
    }
}

/* 取出画面，刷新UI */
void VideoPlayer1::do_refreshUI()
{
    update();
}


/* 通过信号刷新第一张图片 */
void VideoPlayer1::do_refreshOneUI()
{

}

/* 播放完成 */
void VideoPlayer1::do_playCompleted()
{
    SPDLOG_INFO("Video 播放完成...");
    m_timerRefreshUI.stop();
    m_playStatus = false;
    // if(m_funcPlayCB != nullptr)
    // {
    //     /* 播放完成的回调函数 */
    //     m_funcPlayCB(this, 2, nullptr, 0, m_context);
    // }
}


