#pragma once

#include <QWidget>
//#include <QLabel>
#include <QGraphicsOpacityEffect>
#include <QAnimationGroup>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLTexture>
#include <QOpenGLBuffer>
#include <QTimer>

#include "CmdReceiver.h"
#include "ReverseDecodThread.h"
#include "VlcMediaPlayer.h"
#include "Config.h"

class ScreenWidget : public QOpenGLWidget, protected QOpenGLFunctions, public CmdReceiver {
    Q_OBJECT

public:
    explicit ScreenWidget(QWidget* widget = nullptr);
    ~ScreenWidget() override;

    void OnMessage(const QString& cmd) override;
    void OnTimeout();

    void OnAlphaChanged(float alpha) {
        m_alpha = alpha;
    }

protected:
    void keyPressEvent(QKeyEvent* event) override;
    void keyReleaseEvent(QKeyEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
   // void paintEvent(QPaintEvent* event) override;

protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;

    void Save();

    void PlayCricle(const Scope& scop);
    void Play(const Scope& scop);
    void slotSetOneFrame(QImage image);

private:
    void InitMask();

private:
    bool m_ctrlPress{ false };

    int32_t m_town{ -1 };
    int32_t m_place{ -1 };

    QPixmap m_bg;
    int m_x = 0;
    int m_y = 0;
    float m_sx = 1.0f;
    float m_sy = 1.0f;
    int m_r = 1;

    VlcMediaPlayer vlcMediaPlayer_;

    //QTimer m_timer;
    QOpenGLVertexArrayObject* m_vao{ nullptr };
    QOpenGLShader* m_vshader{ nullptr };
    QOpenGLShader* m_fshader{ nullptr };
    QOpenGLShaderProgram* m_program{ nullptr };
    QOpenGLTexture* m_background{ nullptr };
    QOpenGLTexture* m_movie{ nullptr };
    QRect m_moveRect;
    float m_alpha{ 1.0f };

    QVector<QImage> m_textureData;
    int m_cricleFrameCount{ 0 };
    int m_cricleFrame{ INT_MAX };

    Scope m_scope;

    QImage m_maskImage;
    QRect m_drawRect;
    QTime m_lastTime;
};