/**
 * SSE 流式传输工具
 *
 * 将重复的 SSE 读取逻辑抽取为一个通用异步生成器，
 * 供 ChatArea 中的 handleSendMessage 和 handleRegenerateResponse 共用。
 */

const API_BASE = import.meta.env.VITE_API_BASE_URL || '/api'

/** 单条 SSE 事件 */
export interface SSEEvent {
  event: string
  data: string
}

/**
 * 发起 SSE 请求并以异步迭代方式逐条产出事件。
 * 调用方可使用 `for await (const ev of streamSSE(...))` 消费。
 *
 * @param path    相对 API 路径（不含 base），如 `/app/conversation/1/message`
 * @param method  HTTP 方法，默认 POST
 * @param body    请求体（可选）
 */
export async function* streamSSE(
  path: string,
  method: 'POST' | 'GET' = 'POST',
  body?: Record<string, unknown>
): AsyncGenerator<SSEEvent> {
  const token = localStorage.getItem('token')

  const response = await fetch(`${API_BASE}${path}`, {
    method,
    headers: {
      'Content-Type': 'application/json',
      ...(token ? { Authorization: `Bearer ${token}` } : {}),
    },
    body: body !== undefined ? JSON.stringify(body) : undefined,
  })

  if (!response.ok) {
    throw new Error(`SSE 请求失败: ${response.status} ${response.statusText}`)
  }

  const reader = response.body?.getReader()
  if (!reader) throw new Error('无法获取响应流')

  const decoder = new TextDecoder()
  let buffer = ''
  let currentEvent = ''

  try {
    while (true) {
      const { done, value } = await reader.read()
      if (done) break

      buffer += decoder.decode(value, { stream: true })
      const lines = buffer.split('\n')
      buffer = lines.pop() ?? ''

      for (const line of lines) {
        if (line.startsWith('event: ')) {
          currentEvent = line.slice(7).trim()
        } else if (line.startsWith('data: ')) {
          const data = line.slice(6).trim()
          yield { event: currentEvent, data }
          currentEvent = ''
        }
      }
    }
  } finally {
    reader.cancel().catch(() => {})
  }
}
