#ifndef VOICECHATSPEECH_H
#define VOICECHATSPEECH_H

#include <QObject>
#include <QAudioBuffer> //音频缓存
#include <QAudioInput>
#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QThread>
#include <QTimer>
#include <ukui-log4qt.h>

#include <kylin-ai/coreai/speech/recognizer.h>
#include <kylin-ai/coreai/speech/audioconfig.h>
#include <kylin-ai/coreai/speech/error.h>
#include <kylin-ai/coreai/speech/result.h>
#include <kylin-ai/coreai/speech/synthesizer.h>
#include <aiconfig/modelconfig.h>
#include <kylin-ai/common/macros.h>
#include <kylin-ai/private/osassistant/osassistant.h>
#include <common/error.h>

#include "global/kaglobal.h"

class VoiceChatSpeech : public QObject
{
    Q_OBJECT
public:
    explicit VoiceChatSpeech(QObject *parent = nullptr);
    ~VoiceChatSpeech();
signals:
    /**
     * @brief 语音识别信息信号，发送到控制模块并转发到前端生成气泡
     * @param 合成结果内容
     */
    void sigReceiveSpeechRecognitionMessage(const QString message);
    /**
     * @brief 错误信息
     * @param errorCode
     * @param errorMsg
     */
    void sigErrorMsg(const int errorCode,const QString errorMsg);
    /**
     * @brief 回调函数错误信息
     * @param errorCode
     * @param errorMsg
     */
    void sigCallbackErrorMsg(const int errorCode,const QString errorMsg);
    /**
     * @brief 无可用模型
     */
    void sigNoModel();

    /**
     * @brief 当前录音音量信号
     * @param 音量数据，已归一化处理
     */
    void sigCurSpeechVolume(const int volume);

    /**
     * @brief 语音识别已真正开始
     */
    void speechRecognitionStarted();

public:
    /**
     * @brief 初始化语音识别会话
     * @return 语音识别会话是否创建成功
     */
    Q_INVOKABLE bool initSpeechSession();

    /**
     * @brief 关闭语音识别会话
     * @return 无返回值
     */
    Q_INVOKABLE void closeSpeechSession();

    /**
     * @brief 启动语音识别
     */
    Q_INVOKABLE bool startSpeechRecognition();

    /**
     * @brief 暂停语音识别
     */
    Q_INVOKABLE void pauseSpeechRecognition();

    /**
     * @brief 继续语音识别
     */
    Q_INVOKABLE void continueSpeechRecognition();

    /**
     * @brief 停止语音识别
     */
    Q_INVOKABLE void stopSpeechRecognition();

    /**
     * @brief 解析和发送错误信息
     * @param 错误码
     */
    void parseAndSendErrorMsg(const int errorCode);

    /**
     * @brief 将对象移动到工作线程
     * @param thread 目标线程
     */
    void moveToWorkerThread(QThread *thread);

    /**
     * @brief convertMarkDownToHtml
     * @param markDown
     * @return
     */
    QString convertMarkDownToHtml(const QString &markDown);
    /**
     * @brief markdownToHtml
     * @param markdown
     * @return
     */
    QString markdownToHtml(const std::string& markdown);

private:
    SpeechRecognitionSession *m_speechSession = nullptr;
    QThread *m_workerThread = nullptr;  // 工作线程指针
    AudioConfig *m_speechconfig = nullptr;         //语音配置
    QTimer *m_volumeTimer = nullptr;  
public:
    bool is_end;
};

#endif // VOICECHATSPEECH_H
