#ifndef MINICHATTHREAD_H
#define MINICHATTHREAD_H

#include <QObject>
#include <QThread>
#include <QEventLoop>
#include <QJsonObject>
#include <QJsonDocument>
#include <QString>
#include <QClipboard>

#include <genai/text/chat.h>
#include <ukui-log4qt.h>

class CMainWnd;
class MiniChatThread : public QThread
{
    Q_OBJECT
public:
    explicit MiniChatThread(QObject *parent = nullptr);
    ~MiniChatThread();

    static MiniChatThread *getPtr();

signals:
    /* 所有消息都通过这个信号接口向QML端返回通知消息，禁止添加额外接口，应通过在参数里新增字段。该参数为一个json对象。
     * 遵守的格式如下，其中msgType为字符串，标识当前消息的分类。msgBody为一个json对象，用于携带具体的参数。
     * {"msgType":"xxx", "msgBody":{}}
     */
    void receiveMessage(const QString message);

public slots:
    /* 所有消息都通过这个接口从QML端发送消息，禁止添加额外接口，应通过在参数里新增字段。该参数为一个json对象。
     * 遵守的格式如下，其中msgType为字符串，标识当前消息的分类。msgBody为一个json对象，用于携带具体的参数。
     * {"msgType":"xxx", "msgBody":{}}
     */
    void sendMessage(const QString message);

protected:
    void run();

private:
    void initMiniChatThread();
    ChatModelConfig *createWritingSessionConfig();
    void sendChatMsg(const QJsonObject &data);
    void sendStopMsg(const QJsonObject &data);
    void sendCopyText(const QJsonObject &data);

    ChatModelConfig *mWritingConfig = nullptr;
    GenAiTextSession *mWritingSession = nullptr;
    QClipboard *mClipboard = nullptr;
    CMainWnd* mMainWnd = nullptr;
};

#endif // MINICHATTHREAD_H
