// =============================================================================
// 企微IT智能服务台 — 会话 API 调用模块
// =============================================================================
// 说明：封装与会话相关的所有 HTTP 请求
// 对应后端 API：/api/conversations
// 包括：获取会话列表、会话详情、接单、结单、置顶、代办、转接
// =============================================================================

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

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

/** 会话标签集合（对应后端 ConversationTags） */
export interface ConversationTags {
  /** 招手标记（员工说"转人工"或点击敲桌子按钮） */
  hand_raise: boolean
  /** 需介入标记（追问超过N轮） */
  need_intervene: boolean
  /** 情绪标记: neutral/worried/angry/urgent */
  emotion: string
  /** 触发情绪标记的关键词列表 */
  emotion_keywords: string[]
  /** 追问轮次计数 */
  repeat_count: number
}

/** 会话对象（对应后端 ConversationResponse） */
export interface Conversation {
  /** 会话ID */
  id: string
  /** 企微员工UserID */
  employee_id: string
  /** 员工姓名 */
  employee_name: string
  /** 部门 */
  department: string
  /** 岗位 */
  position: string
  /** 等级 */
  level: string
  /** 会话状态: ai_handling/queued/serving/resolved */
  status: string
  /** VIP标记 */
  is_vip: boolean
  /** 置顶标记 */
  is_pinned: boolean
  /** 代办标记 */
  is_todo: boolean
  /** 紧急度评分（1-5） */
  urgency_score: number
  /** 标签集合 */
  tags: ConversationTags
  /** 分配的坐席ID */
  assigned_agent_id: string | null
  /** 最后消息时间 */
  last_message_at: string | null
  /** 最后消息摘要 */
  last_message_summary: string
  /** 创建时间 */
  created_at: string
  /** 更新时间 */
  updated_at: string
  /** 是否为当前坐席的会话 */
  is_mine: boolean
  /** 分配的坐席姓名（其他坐席会话显示用） */
  assigned_agent_name: string | null
  /** 是否可以接手（其他坐席已接单的会话为 True） */
  can_grab: boolean
  /** 协作坐席ID列表 */
  collaborating_agent_ids: string[]
  /** 协作坐席姓名映射（agent_id → name） */
  collaborating_agent_names: Record<string, string>
  /** 是否为协作坐席（非主责） */
  is_collaborator: boolean
  /** 影响范围（受影响人数，0=未评估） */
  impact_scope: number
  /** 阻断性标记（问题是否阻断员工正常工作流程） */
  is_blocking: boolean
  /** 情绪状态（normal/worried/angry/urgent） */
  emotion_state: string
  /** 被邀请参与会话的人员列表（邀请功能 P0-09~P0-11） */
  participants: ParticipantInfo[]
}

/** 参与者信息（邀请功能） */
export interface ParticipantInfo {
  /** 企微员工UserID 或部门ID */
  id: string
  /** 姓名 或 部门名称 */
  name: string
  /** 部门（仅员工类型有） */
  department: string
  /** 类型: employee（个人）或 department（部门） */
  type: 'employee' | 'department'
  /** 头像URL（从企微通讯录或employees表获取，无头像时为空字符串） */
  avatar?: string
  /** 是否已加入（通过链接加入后为 true） */
  joined?: boolean
  /** 加入时间（ISO 格式字符串） */
  joined_at?: string
}

/** 会话列表响应（对应后端 ConversationListResponse） */
export interface ConversationListData {
  /** 会话列表 */
  items: Conversation[]
  /** 总数 */
  total: number
}

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

/**
 * 获取坐席会话列表
 * 支持按状态和坐席ID过滤，按紧急度排序
 *
 * @param params - 查询参数
 * @param params.status - 按状态过滤（可选）
 * @param params.agent_id - 按坐席ID过滤（可选）
 * @param params.page - 页码（从1开始）
 * @param params.page_size - 每页数量
 * @returns 会话列表数据
 */
export async function getConversations(params?: {
  status?: string
  agent_id?: string
  page?: number
  page_size?: number
}): Promise<ConversationListData> {
  const response: AxiosResponse = await apiClient.get('/conversations', { params })
  return response.data.data
}

/**
 * 获取会话详情
 *
 * @param conversationId - 会话ID
 * @returns 会话详情
 */
export async function getConversation(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.get(`/conversations/${conversationId}`)
  return response.data.data
}

/**
 * 坐席接单（接入会话）
 * 将会话状态从 queued 改为 serving
 *
 * @param conversationId - 会话ID
 * @param agentId - 接单的坐席ID
 * @returns 更新后的会话信息
 */
export async function assignConversation(conversationId: string, agentId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/assign`, {
    agent_id: agentId,
  })
  return response.data.data
}

/**
 * 结单
 * 将会话状态改为 resolved
 *
 * @param conversationId - 会话ID
 * @returns 更新后的会话信息
 */
export async function resolveConversation(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/resolve`)
  return response.data.data
}

/**
 * 切换置顶状态
 * 每次调用切换：置顶→取消置顶，取消置顶→置顶
 *
 * @param conversationId - 会话ID
 * @returns 更新后的会话信息
 */
export async function togglePin(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/pin`)
  return response.data.data
}

/**
 * 切换代办状态
 * 每次调用切换：代办→取消代办，取消代办→代办
 *
 * @param conversationId - 会话ID
 * @returns 更新后的会话信息
 */
export async function toggleTodo(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/todo`)
  return response.data.data
}

/**
 * 转接会话到另一个坐席
 *
 * @param conversationId - 会话ID
 * @param targetAgentId - 目标坐席ID
 * @returns 更新后的会话信息
 */
export async function transferConversation(conversationId: string, targetAgentId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/transfer`, {
    agent_id: targetAgentId,
  })
  return response.data.data
}

/**
 * 接手其他坐席的会话（抢单）
 * 接手后原坐席自动释放，会话变为当前坐席的
 *
 * @param conversationId - 会话ID
 * @returns 接手后的会话信息
 */
export async function grabConversation(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/grab`)
  return response.data.data
}

/**
 * 摇人 — 邀请坐席加入协作
 * 邀请后坐席B将出现在协作列表中，可查看和回复但不能结单
 *
 * @param conversationId - 会话ID
 * @param agentId - 被邀请的坐席ID
 * @returns 更新后的会话信息
 */
export async function inviteCollaborator(
  conversationId: string,
  agentId: string
): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/invite`,
    { agent_id: agentId }
  )
  return response.data.data
}

/**
 * 退出协作
 * 坐席从协作列表中移除
 *
 * @param conversationId - 会话ID
 * @returns 更新后的会话信息
 */
export async function leaveCollaboration(conversationId: string): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(`/conversations/${conversationId}/leave`)
  return response.data.data
}

// --------------------------------------------------------------------------
// 邀请功能 API（P0-09~P0-11）
// --------------------------------------------------------------------------

/** 邀请参与者请求参数 */
export interface InviteParticipantParams {
  /** 被邀请人列表 */
  participants: Array<{
    id: string
    name: string
    department?: string
    type: 'employee' | 'department'
  }>
  /** 历史消息共享模式: recent10/all/none */
  history_mode?: 'recent10' | 'all' | 'none'
}

/**
 * 邀请员工/部门加入会话（P0-09）
 * 向被邀请人发送企微卡片通知，含「加入会话」按钮
 *
 * @param conversationId - 会话ID
 * @param params - 邀请参数（含被邀请人列表和历史共享模式）
 * @returns 更新后的会话信息
 */
export async function inviteParticipant(
  conversationId: string,
  params: InviteParticipantParams
): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/invite-participant`,
    params
  )
  return response.data.data
}

/**
 * 被邀请人加入会话（P0-10）
 * 点击企微卡片链接后调用，更新 joined 状态
 *
 * @param conversationId - 会话ID
 * @param employeeId - 加入的员工企微UserID
 * @returns 更新后的会话信息
 */
export async function joinConversation(
  conversationId: string,
  employeeId: string
): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/join`,
    { employee_id: employeeId }
  )
  return response.data.data
}

/**
 * 移除参与者（P0-11）
 * 只有主责坐席可以移除
 *
 * @param conversationId - 会话ID
 * @param userId - 被移除的员工UserID
 * @returns 更新后的会话信息
 */
export async function removeParticipant(
  conversationId: string,
  userId: string
): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.delete(
    `/conversations/${conversationId}/participants/${userId}`
  )
  return response.data.data
}

/**
 * 参与者主动退出会话
 *
 * @param conversationId - 会话ID
 * @param employeeId - 退出的员工企微UserID
 * @returns 更新后的会话信息
 */
export async function leaveAsParticipant(
  conversationId: string,
  employeeId: string
): Promise<Conversation> {
  const response: AxiosResponse = await apiClient.post(
    `/conversations/${conversationId}/leave-participant`,
    { employee_id: employeeId }
  )
  return response.data.data
}
