/**
 * 课程对话 API
 * 
 * 使用 Python 原生 AI 服务实现，支持流式对话
 */

import http from '@/utils/http'

// 基础 URL 配置（仅用于 SSE 流式请求，普通请求走 http 封装）
// 开发环境使用空字符串（走Vite代理），生产环境使用当前域名（支持多域名部署）
const SSE_BASE_URL = (() => {
  if (import.meta.env.DEV || import.meta.env.VITE_APP_ENV === 'development') {
    return ''
  }
  return window.location.origin
})()

/**
 * 课程对话消息参数
 */
export interface CourseChatMessageParams {
  course_id: number
  query: string
  conversation_id?: string
}

/**
 * SSE 事件类型
 */
export interface CourseChatEvent {
  event: 'conversation_started' | 'message_chunk' | 'message_end' | 'error'
  conversation_id?: string
  chunk?: string  // 文本块（逐字返回）
  message?: string  // 错误消息
}

/**
 * 会话信息
 */
export interface Conversation {
  id: string
  course_id: number
  created_at: number
  updated_at: number
  last_message: string
  message_count: number
}

/**
 * 对话消息
 */
export interface ChatMessage {
  role: 'user' | 'assistant'
  content: string
  timestamp?: number
}

/**
 * 课程对话 API
 */
export const courseChatApi = {
  /**
   * 发送消息（SSE 流式）
   * 
   * 注意：SSE 流式响应需要使用原生 fetch（Axios 不支持 ReadableStream）
   * 
   * 使用方式：
   * ```typescript
   * const stream = await courseChatApi.sendMessage({...})
   * const reader = stream.getReader()
   * const decoder = new TextDecoder()
   * 
   * while (true) {
   *   const { done, value } = await reader.read()
   *   if (done) break
   *   
   *   const text = decoder.decode(value)
   *   // 处理 SSE 事件...
   * }
   * ```
   */
  async sendMessage(params: CourseChatMessageParams): Promise<ReadableStream<Uint8Array>> {
    const token = localStorage.getItem('access_token')
    
    const response = await fetch(`${SSE_BASE_URL}/api/v1/course/chat`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
      },
      body: JSON.stringify(params)
    })

    if (!response.ok) {
      const errorText = await response.text()
      throw new Error(`HTTP ${response.status}: ${errorText}`)
    }

    if (!response.body) {
      throw new Error('响应体为空')
    }

    return response.body
  },

  /**
   * 获取历史对话列表
   * 
   * 使用统一的 http 封装，自动处理认证、错误、重试
   */
  async getConversations(limit: number = 20): Promise<Conversation[]> {
    const response = await http.get<{ conversations: Conversation[]; total: number }>(
      '/api/v1/course/conversations',
      { params: { limit } }
    )
    return response.data?.conversations || []
  },

  /**
   * 获取历史消息
   * 
   * 使用统一的 http 封装，自动处理认证、错误、重试
   */
  async getMessages(conversationId: string, limit: number = 50): Promise<ChatMessage[]> {
    const response = await http.get<{ messages: ChatMessage[]; total: number }>(
      '/api/v1/course/messages',
      { params: { conversation_id: conversationId, limit } }
    )
    return response.data?.messages || []
  }
}

