const AGENT_BASE_URL = '';

import { fetchEventSource } from '@microsoft/fetch-event-source';

export const baseInfoApi = () => {
  return fetch(`${AGENT_BASE_URL}`, {
    method: 'GET',
  });
}

/**
 * 流式对话接口，返回流式 JSON 数据，形如 {"text":"我来"}
 * @param message 用户消息
 * @param callbacks 回调函数对象
 * @param options 可选配置，包含 abort signal
 * @example
 * // 使用示例：
 * streamApi('你好', {
 *   onopen(response) {
 *     console.log('连接已建立', response);
 *   },
 *   onmessage(data) {
 *     // data 是服务器发送的原始字符串，如 '{"text":"我来"}'
 *     console.log('收到消息:', data);
 *   },
 *   onclose() {
 *     console.log('连接已关闭');
 *   },
 *   onerror(error) {
 *     console.error('连接错误:', error);
 *   }
 * }, { signal: abortController.signal });
 */
export const streamApi = (
  message: string,
  callbacks: {
    onopen?: (response: Response) => void;
    onmessage?: (data: string) => void;
    onclose?: () => void;
    onerror?: (error: Error) => void;
  },
  options?: { signal?: AbortSignal }
) => {
  // 启动 fetchEventSource
  fetchEventSource(`${AGENT_BASE_URL}/stream`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ message }),
    signal: options?.signal,
    async onopen(response) {
      // 检查响应是否正常
      if (response.ok && response.headers.get('content-type')?.includes('text/event-stream')) {
        // 连接成功，调用 onopen 回调
        callbacks.onopen?.(response);
      } else {
        // 如果响应不正常，抛出错误
        throw new Error(`SSE 连接失败: ${response.status} ${response.statusText}`);
      }
    },
    onmessage(msg) {
      // 处理服务器发送的消息
      // msg.data 应该是 JSON 字符串，如 {"text":"..."}
      try {
        const data = msg.data;
        console.log('Received message:', data);
        if (data && data !== '[DONE]') {
          callbacks.onmessage?.(data);
        }
      } catch (error) {
        console.warn('处理 SSE 消息时出错:', error);
      }
    },
    onclose() {
      // 连接关闭
      console.log('SSE 连接已关闭');
      callbacks.onclose?.();
    },
    onerror(err) {
      // 发生错误
      console.error('SSE 连接错误:', err);
      callbacks.onerror?.(err instanceof Error ? err : new Error(String(err)));

      // 重新抛出错误以停止重试
      throw err;
    },
  }).catch(error => {
    // 捕获 fetchEventSource 的 Promise 拒绝
    if (error.name !== 'AbortError') {
      console.error('fetchEventSource 错误:', error);
      callbacks.onerror?.(error instanceof Error ? error : new Error(String(error)));
    } else {
      // AbortError 是正常的取消操作，不需要调用 onerror
      console.log('请求已被取消');
    }
  });
}