// =============================================================================
// 企微IT智能服务台 — 消息 API 调用模块
// =============================================================================
// 说明：封装与消息相关的所有 HTTP 请求
// 对应后端 API：/api/conversations/{id}/messages
// 包括：获取消息列表、发送消息、轮询新消息
// =============================================================================

import apiClient from './index'
import type { AxiosResponse } from 'axios'

// --------------------------------------------------------------------------
// TypeScript 类型定义 — 与后端 Schema 保持一致
// --------------------------------------------------------------------------

/** 消息对象（对应后端 MessageResponse） */
export interface Message {
  /** 消息ID */
  id: string
  /** 所属会话ID */
  conversation_id: string
  /** 发送者类型: employee/agent/ai/system */
  sender_type: string
  /** 发送者ID */
  sender_id: string
  /** 发送者姓名 */
  sender_name: string
  /** 消息内容 */
  content: string
  /** 消息类型: text/image/voice/video/file/location */
  msg_type: string
  /** 是否为AI建议 */
  ai_suggestion: boolean
  /** 是否已读 */
  is_read: boolean
  /** 创建时间 */
  created_at: string
  /** 企微媒体文件ID（非文本消息时使用） */
  media_id?: string
  /** 媒体文件访问URL（M1 新增：本地存储的文件URL） */
  media_url?: string
  /** 文件名（文件消息时使用） */
  file_name?: string
  /** 文件大小（字节） */
  file_size?: number
  /** 扩展元数据（pic_url/format/location 等） */
  extra_data?: Record<string, any>
  /** 引用回复：被回复的消息ID（M1 新增） */
  reply_to_id?: string
  /** 消息状态：sending/sent/delivered/read（M2 新增） */
  status?: string
  /** 可撤回截止时间（M2 新增） */
  recallable_until?: string
}

/** 消息列表响应（对应后端 MessageListResponse） */
export interface MessageListData {
  /** 消息列表 */
  items: Message[]
  /** 是否还有更多历史消息 */
  has_more: boolean
}

// --------------------------------------------------------------------------
// API 函数
// --------------------------------------------------------------------------

/**
 * 获取会话消息列表（分页）
 * 默认返回最新的 limit 条消息
 * 支持向上加载历史消息（通过 before 参数指定消息ID）
 *
 * @param conversationId - 会话ID
 * @param params - 查询参数
 * @param params.limit - 每页消息数量（默认50）
 * @param params.before - 加载此消息ID之前的消息（向上翻页）
 * @returns 消息列表数据
 */
export async function getMessages(
  conversationId: string,
  params?: {
    limit?: number
    before?: string
  }
): Promise<MessageListData> {
  const response: AxiosResponse = await apiClient.get(
    `/conversations/${conversationId}/messages`,
    { params }
  )
  return response.data.data
}

/**
 * 坐席发送消息
 * 消息同时存入数据库和调用企微API发送给员工
 *
 * @param conversationId - 会话ID
 * @param content - 消息内容
 * @param msgType - 消息类型（默认 text）
 * @param options - 可选的文件/图片消息参数
 * @returns 发送的消息对象
 */
export async function sendMessage(
  conversationId: string,
  content: string,
  msgType: string = 'text',
  options?: {
    media_url?: string
    file_name?: string
    file_size?: number
    reply_to_id?: string
  }
): Promise<Message> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/messages`,
    {
      content,
      msg_type: msgType,
      ...options,
    },
    {
      // 图片/文件消息后端处理可能较慢（存储 + 企微API），增加超时到30秒
      // 修复截图发送超时Bug：apiClient默认10s不够
      timeout: 30000,
    }
  )
  return response.data.data
}

/**
 * 坐席轮询新消息
 * 前端每 3-5 秒调用一次，获取上次轮询后的新消息
 *
 * @param conversationId - 会话ID
 * @param afterMessageId - 上次轮询的最后一消息ID（返回此之后的消息）
 * @returns 新消息列表数据
 */
export async function pollMessages(
  conversationId: string,
  afterMessageId?: string
): Promise<MessageListData> {
  const params: Record<string, string> = {}
  if (afterMessageId) {
    params.after_message_id = afterMessageId
  }
  const response: AxiosResponse = await apiClient.get(
    `/conversations/${conversationId}/messages/poll`,
    { params }
  )
  return response.data.data
}

/**
 * 撤回消息（2分钟内）
 *
 * @param messageId - 消息ID
 * @returns 撤回结果
 */
export async function recallMessage(messageId: string): Promise<any> {
  const response: AxiosResponse = await apiClient.post(
    `/messages/${messageId}/recall`
  )
  return response.data
}

/**
 * 删除消息
 *
 * @param messageId - 消息ID
 * @returns 删除结果
 */
export async function deleteMessage(messageId: string): Promise<any> {
  const response: AxiosResponse = await apiClient.delete(
    `/messages/${messageId}`
  )
  return response.data
}

/**
 * 标记会话已读
 *
 * @param conversationId - 会话ID
 * @returns 标记结果
 */
export async function markConversationRead(conversationId: string): Promise<any> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/mark-read`
  )
  return response.data
}

/**
 * 上传图片
 *
 * @param file - 图片文件
 * @returns 上传结果
 */
export async function uploadImage(file: File): Promise<{
  url: string
  filename: string
  file_size: number
}> {
  const formData = new FormData()
  formData.append('file', file)
  const response: AxiosResponse = await apiClient.post(
    '/messages/image',
    formData,
    { headers: { 'Content-Type': 'multipart/form-data' } }
  )
  return response.data.data
}

/**
 * 上传文件
 *
 * @param file - 文件
 * @returns 上传结果
 */
export async function uploadMessageFile(file: File): Promise<{
  url: string
  filename: string
  file_size: number
}> {
  const formData = new FormData()
  formData.append('file', file)
  const response: AxiosResponse = await apiClient.post(
    '/messages/file',
    formData,
    { headers: { 'Content-Type': 'multipart/form-data' } }
  )
  return response.data.data
}
