class SSEClient {
  constructor(url, options = { }) {
    this.url = url;
    this.options = options; // 可选：headers、withCredentials 等
    this.eventSource = null;
    this.listeners = new Map(); // 存储事件监听器
  }

  // 初始化连接
  connect() {
    if (this.eventSource) return; // 避免重复连接

    // 支持自定义请求头（如 Token 认证）
    this.eventSource = new EventSource(this.url, this.options);

    // 监听默认事件
    this.eventSource.onmessage = (e) => {
      this.emit('message', e.data);
    };

    // 连接打开
    this.eventSource.onopen = () => {
      this.emit('open');
    };

    // 错误处理
    this.eventSource.onerror = (err) => {
      this.emit('error', err);
      // 连接关闭时销毁实例
      if (this.eventSource.readyState === EventSource.CLOSED) {
        this.destroy();
      }
    };
  }

  // 监听自定义事件
  on(eventName, callback) {
    if (!this.listeners.has(eventName)) {
      this.listeners.set(eventName, []);
    }
    this.listeners.get(eventName).push(callback);

    // 注册到 EventSource
    this.eventSource?.addEventListener(eventName, (e) => {
      callback(JSON.parse(e.data)); // 统一解析 JSON
    });
  }

  // 触发事件（内部使用）
  emit(eventName, data) {
    const callbacks = this.listeners.get(eventName);
    callbacks?.forEach((cb) => cb(data));
  }

  // 关闭连接并销毁
  destroy() {
    if (this.eventSource) {
      this.eventSource.close();
      this.eventSource = null;
      this.listeners.clear();
      console.log('SSE 连接已销毁');
    }
  }
}

// 导出单例（全局复用一个连接）
export const sseClient = new SSEClient('/model/workflows/run', {
  // 可选：携带认证信息（如 Token）
  // headers: {
  //   'Authorization': `Bearer ${localStorage.getItem('token')}`
  // },
  method: 'POST',
  withCredentials: true // 跨域时携带 Cookie
});