import request from '../utils/request'

/**
 * Agent 对话 API。
 *
 * <p>对应后端 {@code ChatController}，路径前缀 /api/chat/...。
 * 普通接口走 axios request（已自动解包 res.data）；
 * SSE 流订阅用原生 fetch（避免被 interceptor 误处理）。</p>
 */

/* ============== 会话管理 ============== */

export function listSessions() {
  return request.get('/chat/sessions')
}

export function createSession(data) {
  return request.post('/chat/sessions', data)
}

export function getSession(id) {
  return request.get(`/chat/sessions/${id}`)
}

/**
 * 修改会话属性：重命名 / 置顶。仅传哪个字段就只改哪个。
 * @param {number} id
 * @param {Object} patch {title?, pinned?}
 */
export function updateSession(id, patch) {
  return request.patch(`/chat/sessions/${id}`, patch)
}

/* ============== 单轮问答 ============== */

/**
 * 发起一轮问答。
 * @param {number} sessionId
 * @param {Object} body {message, modelId?, skillFolder?, maxIterations?, parentMessageId?}
 * @returns {Promise<{runId, messageId}>}
 */
export function startRun(sessionId, body) {
  return request.post(`/chat/sessions/${sessionId}/runs`, body)
}

export function getRunState(runId) {
  return request.get(`/chat/runs/${runId}/state`)
}

export function submitClarify(runId, clarifyId, answer) {
  return request.post(`/chat/runs/${runId}/resume`, { clarifyId, answer })
}

/**
 * 订阅 SSE 流（断线重连入口）。
 * 直接返回 Response（含 body.getReader），由 useChat 解析。
 *
 * <p>注：用 {@code credentials: 'include'} 让 cookie 同源共享，
 * 未来若接入基于 cookie 的鉴权（如 JSESSIONID / CSRF token），SSE 也能复用。</p>
 *
 * @param {string} runId
 * @param {number|null} lastEventId 上次收到的最大事件 id，用于断点续传
 * @returns {Promise<Response>}
 */
export function subscribeRunStream(runId, lastEventId = null) {
  const url = new URL(`/api/chat/runs/${runId}/stream`, window.location.origin)
  if (lastEventId != null) {
    url.searchParams.set('lastEventId', String(lastEventId))
  }
  const headers = {
    Accept: 'text/event-stream'
  }
  if (lastEventId != null) {
    headers['Last-Event-ID'] = String(lastEventId)
  }
  // 复用 axios 默认 header（如 Authorization），若未来注入鉴权拦截器可一并携带
  const authHeader = request.defaults.headers?.common?.Authorization
  if (authHeader) {
    headers.Authorization = authHeader
  }
  return fetch(url, {
    method: 'GET',
    credentials: 'include',
    headers
  })
}

/* ============== 会话级操作（删除 / 导出 / 重置） ============== */

/** 删除会话（软删除：标 ARCHIVED）。 */
export function deleteSession(sessionId) {
  return request.delete(`/chat/sessions/${sessionId}`)
}

/**
 * 导出会话为 Markdown 附件。
 * 后端返回 text/markdown 字节流；浏览器直接保存为文件。
 */
export async function exportSession(sessionId) {
  const url = `/api/chat/sessions/${sessionId}/export`
  const headers = { Accept: 'text/markdown' }
  const authHeader = request.defaults.headers?.common?.Authorization
  if (authHeader) headers.Authorization = authHeader
  const resp = await fetch(url, { method: 'GET', credentials: 'include', headers })
  if (!resp.ok) {
    throw new Error(`导出失败：HTTP ${resp.status}`)
  }
  // 从 Content-Disposition 解析文件名（后端已 URL 编码）
  const cd = resp.headers.get('Content-Disposition') || ''
  let filename = `对话-${sessionId}-${Date.now()}.md`
  const match = cd.match(/filename\*=UTF-8''([^;]+)/i)
  if (match) {
    filename = decodeURIComponent(match[1])
  } else {
    const m2 = cd.match(/filename="([^"]+)"/i)
    if (m2) filename = decodeURIComponent(m2[1])
  }
  const blob = await resp.blob()
  // 触发浏览器下载
  const objUrl = URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.href = objUrl
  a.download = filename
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
  URL.revokeObjectURL(objUrl)
  return { filename }
}

/** 重置会话：清空当前对话历史（软清空，不删数据）。 */
export function resetSession(sessionId) {
  return request.post(`/chat/sessions/${sessionId}/reset`)
}

/* ============== 版本管理（重新生成 / 编辑 / 切换） ============== */

/** 重新生成 assistant 消息：触发新的 run。 */
export function regenerateMessage(messageId) {
  return request.post(`/chat/messages/${messageId}/regenerate`)
}

/** 编辑 user 消息：旧消息 inactive + 新建 + 触发 run。 */
export function editMessage(messageId, content) {
  return request.patch(`/chat/messages/${messageId}`, { content })
}

/** 列出消息的所有版本（同 parent 的兄弟）。 */
export function listMessageVersions(messageId) {
  return request.get(`/chat/messages/${messageId}/versions`)
}

/** 切换激活版本到目标消息。 */
export function activateMessageVersion(messageId) {
  return request.post(`/chat/messages/${messageId}/activate`)
}
