/**
 * SSE 工具函数 — 为阶段二/三的流式功能做准备
 *
 * 阶段二将用于：
 *   1. 问题排查 AI 分析流 /api/analyze/stream
 *      事件类型：start / matched_cases / chunk / done / error
 *   2. 服务监测巡检流 /api/service-monitor/run/stream
 *      事件类型：progress / module_done / finished / error / cancelled
 *
 * 后端响应头：Cache-Control: no-cache, X-Accel-Buffering: no, Connection: keep-alive
 */

export interface SSEOptions {
  /** SSE 端点 URL（相对路径，如 /api/analyze/stream） */
  url: string
  /** URL 查询参数 */
  params?: Record<string, string>
  /** 事件处理器映射（key 为事件 type） */
  handlers: Record<string, (data: any) => void>
  /** 连接错误回调 */
  onError?: (error: Event) => void
  /** 连接打开回调 */
  onOpen?: () => void
  /** 是否携带 Cookie（默认 true，Flask Session 需要） */
  withCredentials?: boolean
}

export interface SSEConnection {
  /** 关闭 SSE 连接 */
  close: () => void
  /** 获取原生 EventSource 实例（高级用法） */
  getSource: () => EventSource | null
}

/**
 * 创建通用 SSE 连接
 *
 * 用法示例（阶段二）：
 *   const conn = createSSE({
 *     url: '/api/analyze/stream',
 *     params: { query: '...', project_name: '...' },
 *     handlers: {
 *       start: (e) => console.log('开始', e.message),
 *       chunk: (e) => appendContent(e.content),
 *       done: (e) => console.log('完成', e.api_time),
 *       error: (e) => console.error('错误', e.message),
 *     }
 *   })
 *   // 需要取消时
 *   conn.close()
 */
export function createSSE(options: SSEOptions): SSEConnection {
  const {
    url,
    params = {},
    handlers,
    onError,
    onOpen,
    withCredentials = true,
  } = options

  // 构建带参数的 URL
  const queryString = new URLSearchParams(params).toString()
  const fullUrl = queryString ? `${url}?${queryString}` : url

  // 创建 EventSource
  const source = new EventSource(fullUrl, { withCredentials })

  // 连接打开
  if (onOpen) {
    source.onopen = onOpen
  }

  // 监听消息
  source.onmessage = (event) => {
    try {
      const data = JSON.parse(event.data)
      const handler = handlers[data.type]
      if (handler) {
        handler(data)
      }
    } catch (err) {
      console.warn('SSE 消息解析失败:', event.data, err)
    }
  }

  // 监听错误
  source.onerror = (event) => {
    if (onError) {
      onError(event)
    }
    // 自动关闭连接（避免无限重连）
    source.close()
  }

  return {
    close: () => source.close(),
    getSource: () => source,
  }
}

/**
 * 创建巡检 SSE 连接（服务监测专用）
 *
 * 事件类型：progress / module_done / finished / error / cancelled
 * 阶段三实现具体逻辑时使用
 */
export function createInspectionSSE(
  targetId: string,
  suite: string,
  handlers: Record<string, (data: any) => void>,
  onError?: (error: Event) => void
): SSEConnection {
  return createSSE({
    url: '/api/service-monitor/run/stream',
    params: { target_id: targetId, suite },
    handlers,
    onError,
  })
}