import { McpAgent } from "./agent.js";
import { aiConfigManager, AIModelConfig } from "./config.js";
import { mcpModulesManager } from "./module.js";
import { StreamBuffer } from "./streamBuffer.js";
import { z } from "zod";

export class WebMcpAgent {
  private agent: McpAgent | undefined;
  private streamBuffer: StreamBuffer = new StreamBuffer();
  private onmessage: (message: string) => void = () => {};
  private onfinish: () => void = () => {};
  constructor(config: AIModelConfig) {
    aiConfigManager.setConfig(config);
  }

  updateConfig(config: AIModelConfig) {
    aiConfigManager.setConfig(config);
  }

  createChat() {
    this.agent = new McpAgent();
    this.streamBuffer.reset(); // 重置流式缓存器

    this.agent?.session.on("reply", (deltaMessage) => {
      // 使用智能缓存器处理流式内容
      const readyToSend = this.streamBuffer.processChunk(deltaMessage);
      if (readyToSend) {
        this.onmessage(readyToSend);
      }
    });

    this.agent?.session.on("finish", () => {
      // 会话结束时，刷新缓存器中剩余的内容
      const remainingContent = this.streamBuffer.flush();
      if (remainingContent) {
        this.onmessage(remainingContent);
      }
      this.onfinish();
    });

    return this.agent;
  }

  /**
   * 获取聊天消息
   * @returns 聊天消息列表
   */
  public getChatMessages() {
    return this.agent?.session.list();
  }

  /**
   * 获取当前聊天会话
   * @returns 聊天会话
   */
  getAgent() {
    if (!this.agent) {
      this.createChat();
    }
    return this.agent;
  }

  /**
   * 发送消息
   * @param message 消息内容
   */
  chat(message: string) {
    if (!this.agent) {
      this.createChat();
    }
    return this.agent!.chat(message);
  }

  /**
   * 取消当前聊天
   */
  cancelChat() {
    if (this.agent) {
      this.agent.cancelChat();
    }
  }

  /**
   * 注册回复事件
   * @param onmessage 回复事件
   * @param onfinish 完成事件
   */
  onReply(onmessage: (message: string) => void, onfinish: () => void) {
    this.onmessage = onmessage;
    this.onfinish = onfinish;
  }
}

export const createMcpDslModule =
  mcpModulesManager.createMcpDslModule.bind(mcpModulesManager);
export const createMcpServerModule =
  mcpModulesManager.createMcpServerModule.bind(mcpModulesManager);

export { mcpModulesManager, z };
export type { McpServerConfig } from "./mcp.js";
