#ifndef VOICECHATANSWER_H
#define VOICECHATANSWER_H

#include <QObject>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QObject>
#include <QThread>
#include <QAudioBuffer> //音频缓存
#include <QAudioInput>
#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QThread>
#include <ukui-log4qt.h>
#include <QAudioOutput>
#include <QAudioFormat>
#include <QAudioDecoder>
#include <QIODevice>
#include <QThread>
#include <QTemporaryFile>
#include <QQueue>
#include <QMutex>
#include <QWaitCondition>
#include <QMediaPlayer>
#include <QQueue>
#include <QByteArray>

#include "global/kaglobal.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 "voicechatreader.h"
#include "voicechatspeech.h"

/**
 * @brief 语音对话中的大模型回答模块，根据持续语音识别文本内容进行问答
 */
class VoiceChatAnswer : public QObject
{
    Q_OBJECT
public:
    explicit VoiceChatAnswer(QObject *parent = nullptr);
    ~VoiceChatAnswer();
    static VoiceChatAnswer *getPtr();
    /**
     * @brief 初始化信号槽连接
     */
    void initConnect();
    /**
     * @brief 初始化对话会话
     * @return
     */
    bool initChatSession();

    /**
     * @brief 停止会话
     */
    void stopChat();

    /**
     * @brief 停止回复
     */
    void stopReply();

    /**
     * @brief 打断回复
     */
    void interruptReply();

    /**
     * @brief 清除上下文
     */
    void clearContext();

    ///
    /// \brief 问题发送函数，发送问题到大模型
    /// \param 发送文本
    /// \param 发送文件路径
    ///
    void sendQuestion(QString text, QString filePath);

    /**
     * @brief 设置会话ID
     * @param 会话ID
     */
    void setSession(int voiceSessionID);

    /**
     * @brief 关闭会话
     */
    void closeSession();

    /**
     * @brief 返回当前回答状态
     * @return 是否正在回答
     */
    bool getCurrentAnswerStatus();

    /**
     * @brief 设置打断状态
     */
    void setInterrupt(bool isInterrupt);

    /**
     * @brief 获取当前是否正在执行打断
     * @return
     */
    bool getInterruptStatue();
    /**
     * @brief 解析和发送错误信息
     * @param 错误码
     */
    void parseAndSendErrorMsg(const int errorCode);

    /**
     * @brief setModel
     * @param name
     */
    void setModel(const QString name);

    /**
     * @brief 设置深度思考
     * @param checked
     */
    void setDeepThinking(bool checked);

    /**
     * @brief 设置联网搜索
     * @param checked
     */
    void setWebSearch(bool checked);
signals:
    /**
     * @brief 收到的文本回复
     * @param 文本信息
     */
    void sigReceiveChatAnswerMessage(const QString message);
    void reply(const QString &message, bool is_end, int index, int errorCode, QString model);
    void errorReply(int errorCode, QString errorMsg);
    void sigFreeAllocatedError(const int errorCode,const QString errorMsg); // 免费试用账号用尽提示
    /**
     * @brief 启动回答信号，启动回答后需要将状态设置为正在回复中
     */
    void sigBeginReplying();

    /**
     * @brief 打断成功信号
     */
    void sigInterruptSuessful();
public:
    TartgetType target = RECVMSG;
    bool m_isFirstReply; // 记录是否为第一次回复
    bool is_end;
    bool is_reasoning_end;
    QString result_msg;
    QString model_msg;
    int result_index;
    QString reasoningContentMsg;//深度思考内容
    QString text;
    bool m_isAnswing;
    bool m_isNeedAnswering = false;
    bool m_isInterrupt = false;
    bool m_isDeepThinking = false;
    bool m_isWebSearch = false;
private:
    OsAssistant *m_voiceThreadOsassistant = nullptr;
    int m_voiceThreadSessionID; //语音通话ID
};

#endif // VOICECHATANSWER_H
