/**
 * AI问答助手核心功能封装
 * 可在不同项目中复用的AI问答功能 - Vue 2版本
 */

class AIAssistant {
  /**
   * 构造函数
   * @param {Object} config - 配置选项
   * @param {string} config.chatModelUrl - AI服务基础URL
   * @param {string} config.modelAuthKey - AI服务认证密钥
   * @param {string} config.knowledgeBaseId - 知识库ID（可选）
   * @param {string} config.knowledgeBaseUrl - 知识库查询URL（可选）
   * @param {string} config.knowledgeBaseAuthKey - 知识库认证密钥（可选）
   */
  constructor(config = {}) {
    this.chatModelUrl = config.chatModelUrl || "/api/chat/completions";
    this.modelAuthKey = config.modelAuthKey;
    this.knowledgeBaseId = config.knowledgeBaseId;
    this.knowledgeBaseUrl =
      config.knowledgeBaseUrl || "/api/knowledgebases/query";
    this.knowledgeBaseAuthKey =
      config.knowledgeBaseAuthKey ||
      "Bearer bce-v3/ALTAK-Whk44lUWwOsyro8mNlVhq/a0f9f719410e695928289034690003afe1571556";
  }

  /**
   * 查询知识库获取参考内容
   * @param {string} query - 查询内容
   * @param {string} knowledgeBaseId - 知识库ID（可选，优先使用）
   * @returns {Promise<Object|null>} 知识库查询结果
   */
  async queryKnowledgeBase(query, knowledgeBaseId = null) {
    const kbId = knowledgeBaseId || this.knowledgeBaseId;

    if (!kbId) {
      console.log("未提供知识库ID");
      return null;
    }

    console.log("正在查询知识库:", kbId, "查询内容:", query);

    try {
      const response = await fetch(this.knowledgeBaseUrl, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Accept: "application/json",
          Authorization: this.knowledgeBaseAuthKey,
        },
        body: JSON.stringify({
          query: query,
          knowledgebase_ids: [kbId],
          rank_score_threshold: "0.4",
          pipeline_config: {
            ranking: "true",
          },
        }),
      });

      console.log("知识库查询响应状态:", response.status);

      if (response.ok) {
        const data = await response.json();
        console.log("知识库查询结果:", data);
        return data;
      } else {
        console.error("知识库查询失败，状态码:", response.status);
        const errorText = await response.text();
        console.error("错误详情:", errorText);
      }
    } catch (error) {
      console.error("查询知识库时出错:", error);
    }

    return null;
  }

  /**
   * 从知识库返回的数据中提取参考内容
   * @param {Object} knowledgeData - 知识库返回的数据
   * @returns {string} 提取的参考内容
   */
  extractKnowledgeContent(knowledgeData) {
    if (!knowledgeData) return "";

    let knowledgeContent = "";

    if (knowledgeData.chunks) {
      // 从 chunks 数组中提取 content 并拼接
      knowledgeContent = knowledgeData.chunks
        .map((chunk) => chunk.content || "")
        .join("\n\n");
      console.log("从chunks提取的知识库内容:", knowledgeContent);
    } else if (knowledgeData.references) {
      // 保留原有逻辑以确保向后兼容
      knowledgeContent = knowledgeData.references
        .map((ref) => `文档片段: ${ref.title || ""}\n${ref.content || ""}`)
        .join("\n\n");
      console.log("从references提取的知识库内容:", knowledgeContent);
    } else {
      console.log("未找到相关参考内容");
    }

    return knowledgeContent;
  }

  /**
   * 构造发送给AI的消息
   * @param {string} question - 用户问题
   * @param {string} knowledgeContent - 知识库参考内容
   * @returns {Array} 消息数组
   */
  constructMessages(question, knowledgeContent = "") {
    // 系统消息
    const systemMessage = {
      role: "system",
      content: `# 角色任务
作为读书辅导教师，你的核心任务是理解用户的问题，结合提供的参考内容，如书籍片段、笔记、解析等，理解并把握问题的核心。你需要能够区分参考内容中与问题相关的部分，并排除无关的信息。在用户提问时，结合你的知识和理解，给出针对性的回答。

# 工具能力
1. 理解用户问题：你需要能够准确理解用户的问题，明确用户需求和困惑点。
2. 分析参考内容：结合提供的参考内容，如书籍片段、笔记、解析等，找出与问题相关的关键信息。
3. 排除无关内容：在理解用户问题和分析参考内容的基础上，排除与根问题无关的信息。
4. 知识储备：作为读书辅导教师，你需要有广泛的知识储备，能够针对用户的问题给出解答。
5. 交互能力：在用户提问时，与用户进行交互，引导用户表达更清楚自己的问题。

# 要求与限制
1. 响应格式：返回的回答需要以HTML格式呈现，不要强调HTML格式。
2. 针对性回答：结合用户的问题和参考内容，给出针对性的回答，不要提及参考内容。
3. 问题与参考内容关联判断：如果问题与参考内容无关，要明确告诉用户（例如："这个问题与本书内容无关"），进行提示并给出建议（例如：以下建议来自互联网仅供参考...）。
4. 简洁明了：在回答用户问题时，力求简洁明了，避免冗余和复杂的表述。
5. 准确性：确保给出的答案准确无误，能够真正帮助用户解决问题。
6. 如果参考内容里有图片，视频等资源，也一起返回。

`,
    };

    // 用户消息
    let userMessageContent = question;
    if (knowledgeContent) {
      userMessageContent = `问题：${question} 参考：${knowledgeContent}`;
    }

    const userMessage = {
      role: "user",
      content: userMessageContent,
    };

    return [systemMessage, userMessage];
  }

  /**
   * 发送消息到AI并获取回复
   * @param {string} question - 用户问题
   * @param {string} knowledgeBaseId - 知识库ID（可选）
   * @returns {Promise<ReadableStream>} AI回复的流
   */
  async sendMessage(question, knowledgeBaseId = null) {
    try {
      // 查询知识库获取参考内容
      let knowledgeContent = "";
      if (this.knowledgeBaseId || knowledgeBaseId) {
        console.log("开始查询知识库...");
        const knowledgeData = await this.queryKnowledgeBase(
          question,
          knowledgeBaseId
        );
        console.log("知识库返回数据:", knowledgeData);
        knowledgeContent = this.extractKnowledgeContent(knowledgeData);
      } else {
        console.log("未提供知识库ID，跳过查询");
      }

      // 构造发送给AI的消息
      const messages = this.constructMessages(question, knowledgeContent);

      // 创建请求
      const url = `${this.chatModelUrl}/chat/completions`;
      const requestBody = {
        messages: messages,
        model: "ernie-4.5-turbo-128k",
        stream: true,
      };

      console.log("发送给AI的请求:", JSON.stringify(requestBody, null, 2));

      const response = await fetch(url, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${this.modelAuthKey}`,
        },
        body: JSON.stringify(requestBody),
      });

      if (!response.body) {
        throw new Error("ReadableStream not supported");
      }

      return response.body.getReader();
    } catch (error) {
      console.error("Error sending message:", error);
      throw error;
    }
  }
}

// 导出 AIAssistant 类
export { AIAssistant };
