#ifndef INTERACTIVEFACE_H
#define INTERACTIVEFACE_H
#include <QQuickImageProvider>
#include <QtQml>
#include <QJSValue>
#include <QMutex>
#include <QImage>
#include <QCamera>
#include <QVideoProbe>
#include <QVideoFrame>
#include <QTimer>
#include <QVariantList>
#include <QRect>

#define INTERACTIVE_FACE_IMAGE_URL "InteractiveFaceImage"

class InteractiveFace : public QObject, public QQuickImageProvider
{
    Q_OBJECT
    QML_SINGLETON
    QML_NAMED_ELEMENT(InteractiveFace)

private:
    InteractiveFace(QObject *parent = nullptr);
    ~InteractiveFace();

    // 获取图像url
    QString getImageUrl();
public:
    static InteractiveFace* pInstance;
    static InteractiveFace* instance();
    static InteractiveFace* create(QQmlEngine*, QJSEngine*);

    // 设置图像采集回调
    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();

    // 获取图像 URL，供 QML Image 刷新显示
    Q_INVOKABLE QString imageUrl();
    // 是否有可用摄像头
    Q_INVOKABLE bool hasCamera();
    // 是否有有效的摄像头画面
    Q_INVOKABLE bool hasValidImage();
    // 获取图像
    QImage getImage();

    // 人脸检测（需 OpenCV）：检测框数量、框列表(图像像素坐标)、图像尺寸、截取单人脸图用于登录
    Q_INVOKABLE int faceCount() const;
    Q_INVOKABLE QVariantList faceRects() const;
    Q_INVOKABLE int imageWidth() const;
    Q_INVOKABLE int imageHeight() const;
    Q_INVOKABLE QByteArray captureFaceImageForLogin();
    /** 当前是否可截取单人脸用于登录（单人脸、完整在框内、不贴边） */
    Q_INVOKABLE bool canCaptureFaceForLogin() const;

signals:
    void faceDetectionUpdated();

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

private slots:
    void onVideoFrameProbed(const QVideoFrame &frame);

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

    // 判断电脑上是否存在摄像头（内部用，QML 用 Q_INVOKABLE hasCamera()）

    void cameraPlay();
    void cameraStop();

    // 人脸检测（内部，每帧或定时调用）
    void runFaceDetection(const QImage &image);

public:
    QMutex m_mutex;

private:
    int m_FrameId;      // 帧过滤
    QImage m_image;     // 图像

    QCamera *m_camera;           // 照相机
    QVideoProbe *m_probe;        // 视频帧探测

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

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

    // 人脸检测结果（图像像素坐标）
    mutable QMutex m_faceMutex;
    int m_faceCount = 0;
    QList<QRect> m_faceRects;
    int m_imageWidth = 0;
    int m_imageHeight = 0;
};

inline InteractiveFace* GetInteractiveFace() {
    return InteractiveFace::instance();
}
#endif // INTERACTIVEFACE_H
