#include "elevideo.h"
#include "tools.h"
#include <QGraphicsVideoItem>
#include <QMediaPlaylist>
#include <QMessageBox>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>

EleVideo::EleVideo(QString path, int w, int h, QWidget *parent) : QGraphicsView{parent} {
    setFrameStyle(QFrame::NoFrame);
    setScene(new QGraphicsScene(this));
    setBackgroundBrush(QColor(0,0,0));
    auto videoItem = new QGraphicsVideoItem();
    videoItem->setSize(QSize(w,h));
    videoItem->setAspectRatioMode(Qt::IgnoreAspectRatio);
    scene()->addItem(videoItem);
    player = new QMediaPlayer(videoItem);
    player->setVideoOutput(videoItem);
    connect(player, &QMediaPlayer::mediaStatusChanged, this, [this](QMediaPlayer::MediaStatus status){
        if(status==QMediaPlayer::EndOfMedia) {
            if(player->state() != QMediaPlayer::PlayingState && isVisible()) player->play();
        }
    });
    void(QMediaPlayer::*player_error)(QMediaPlayer::Error) = &QMediaPlayer::error;
    connect(player, player_error, this, [this](QMediaPlayer::Error error){
        QMessageBox::critical(this, "Video Error", Tools::playerErrStr(error)+": "+player->errorString());
    });
    player->setMedia(QUrl::fromLocalFile(path));
}

void EleVideo::showEvent(QShowEvent *) {
    if(player!=nullptr && player->state() != QMediaPlayer::PlayingState) player->play();
}
void EleVideo::hideEvent(QHideEvent *) {
    if(player!=nullptr) player->stop();
}