#ifndef INTERACTIVEFACE_H
#define INTERACTIVEFACE_H

#include <QObject>
#include <QJSValue>

#include <QTimer>
#include <QDateTime>

#include <QImage>
#include <QVideoFrame>
#include <QPainter>
#include <QBuffer>

#include <QString>
#include <QBuffer>
#include <QByteArray>
#include <QTimerEvent>
#include <QMutex>
#include <QMutexLocker>

#include <QCamera>
#include <QVideoSink>
#include <QMediaDevices>
#include <QMediaCaptureSession>
#include <QQuickImageProvider>

#include <QtMath>
#include <QRandomGenerator>

#include "template_singleton.h"

#include "sdk/hrsdk/inc/amcomdef.h"
#include "sdk/hrsdk/inc/arcsoft_face_sdk.h"
#include "sdk/hrsdk/inc/asvloffscreen.h"
#include "sdk/hrsdk/inc/merror.h"
#include "user/filelogger.h"

#define INTERACTIVE_FACE_IMAGE_URL "InteractiveFaceImage"

class InteractiveFace : public QQuickImageProvider
{
    SINGLETON_DEFINE(InteractiveFace)       // 定义为单例类
    Q_OBJECT
private:
    InteractiveFace(QObject *parent = nullptr);
    ~InteractiveFace();

    // 获取图像url
    QString getImageUrl();
public:

    // 设置图像采集回调
    Q_INVOKABLE void setCameraImageGatherCallBack(QJSValue callback);
    // 设置发现人脸回调
    Q_INVOKABLE void setCameraImageAppearCallBack(QJSValue callback);
    // 设置人脸停留回调（5s）
    Q_INVOKABLE void setCameraImageRemainCallBack(QJSValue callback);
    // 回调函数设置
    Q_INVOKABLE void setCameraImageCallBack(QJSValue gatherCallback,
                                            QJSValue appearCallback,
                                            QJSValue remainCallback);



    // 发现人脸状态
    Q_INVOKABLE void setCallBackFaceStatus(QJSValue isAppearCallback);


    // 相机图像播放 (采集)
    Q_INVOKABLE void cameraImagePlay();
    // 相机图像停止 (采集)
    Q_INVOKABLE void cameraImageStop();

    // 获取图像
    QImage getImage();


protected:
    QImage requestImage(const QString &, QSize *, const QSize &);

    void timerEvent(QTimerEvent *event);
private:
    // 初始化虹软人脸识别
    void initEngine();
    // 销毁虹软人脸识别
    void destroyEngine();

    // 初始化相机
    void initCamera();
    // 销毁相机
    void destroyCamera();

    // 判断电脑上是否存在摄像头
    bool hasCamera();


    void cameraPlay();
    void cameraStop();

public:
    QMutex m_mutex;

private:
    int m_timerId;      // 当前定时器ID
    int m_FrameId;      // 帧过滤


    QImage m_image;     // 图像

    MHandle m_engine;   // 虹软引擎
    QCamera m_camera;   // 照相机

    QVideoSink m_videoSink;         // 视频接收器
    QMediaCaptureSession m_session; // 媒体连接器

    // 记录信息
    qint32 m_laseCount = 0;
    qint64 m_laseEpoch = 0;

    QJSValue m_imageGatherCallback; // 图像采集回调
    QJSValue m_imageAppearCallback; // 发现人脸回调
    QJSValue m_imageRemainCallback; // 人脸停留回调


    QJSValue m_isAppearCallback;
};

#endif // INTERACTIVEFACE_H
