// =============================================================================
// 企微IT智能服务台 — 坐席 API 调用模块
// =============================================================================
// 说明：封装与坐席相关的所有 HTTP 请求
// 对应后端 API：/api/agents
// 包括：登录、获取当前坐席、更新状态、获取坐席列表
// =============================================================================

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

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

/** 坐席对象（对应后端 AgentResponse） */
export interface Agent {
  /** 坐席ID */
  id: string
  /** 企微用户ID */
  user_id: string
  /** 坐席姓名 */
  name: string
  /** 坐席状态: online/offline/busy */
  status: string
  /** 当前服务会话数 */
  current_load: number
  /** 最大同时服务数 */
  max_load: number
  /** 创建时间 */
  created_at: string
  /** 更新时间 */
  updated_at: string
}

/** 登录响应数据（包含坐席信息和 token） */
export interface LoginData extends Agent {
  /** 认证 token（存入 localStorage，后续请求自动携带） */
  token: string
}

/** 坐席列表响应 */
export interface AgentListData {
  /** 坐席列表 */
  items: Agent[]
}

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

/**
 * 坐席登录
 * 第一步使用简单的用户名登录（无密码验证）
 * admin 角色需要 OTP 二次验证
 * 登录成功后 token 存入 localStorage，后续请求自动携带
 *
 * @param userId - 企微用户ID
 * @param name - 坐席姓名
 * @param otpCode - OTP 动态码（admin 角色必填）
 * @returns 坐席信息和 token
 */
export async function login(userId: string, name: string, otpCode?: string): Promise<LoginData> {
  const response: AxiosResponse = await apiClient.post('/agents/login', {
    user_id: userId,
    name: name,
    otp_code: otpCode || undefined,
  })
  return response.data.data
}

/**
 * 获取当前坐席信息
 * 需要在请求头中携带有效的 token
 *
 * @returns 当前坐席信息
 */
export async function getCurrentAgent(): Promise<Agent> {
  const response: AxiosResponse = await apiClient.get('/agents/me')
  return response.data.data
}

/**
 * 更新坐席状态
 * 坐席可以切换为 online/busy/offline
 *
 * @param status - 新的坐席状态: online/busy/offline
 * @returns 更新后的坐席信息
 */
export async function updateAgentStatus(status: string): Promise<Agent> {
  const response: AxiosResponse = await apiClient.put('/agents/me/status', {
    status,
  })
  return response.data.data
}

/**
 * 获取坐席列表
 * 用于转接选择时展示可用的坐席列表
 *
 * @param status - 按状态过滤（可选）: online/busy/offline
 * @returns 坐席列表
 */
export async function getAgents(status?: string): Promise<AgentListData> {
  const params: Record<string, string> = {}
  if (status) {
    params.status = status
  }
  const response: AxiosResponse = await apiClient.get('/agents', { params })
  return response.data.data
}

// --------------------------------------------------------------------------
// OTP 双因素认证
// --------------------------------------------------------------------------

/** OTP 绑定响应 */
export interface OtpBindData {
  /** 二维码图片（base64） */
  qr_code: string
  /** 密钥（手动输入用） */
  secret: string
}

/** OTP 验证响应 */
export interface OtpVerifyData {
  /** 是否已启用 */
  otp_enabled: boolean
  /** 消息 */
  message: string
}

/**
 * 绑定 OTP
 * 为当前坐席生成 OTP 密钥和二维码
 * 返回二维码（base64）和密钥供手动输入
 *
 * @returns OTP 绑定信息（二维码和密钥）
 */
export async function bindOtp(): Promise<OtpBindData> {
  const response: AxiosResponse = await apiClient.post('/agents/otp-bind')
  return response.data.data
}

/**
 * 验证并启用 OTP
 * 用户输入 OTP 码验证成功后，启用 OTP
 *
 * @param userId - 坐席ID
 * @param otpCode - OTP 动态码
 * @returns 验证结果
 */
export async function verifyOtp(userId: string, otpCode: string): Promise<OtpVerifyData> {
  const response: AxiosResponse = await apiClient.post('/agents/otp-verify', {
    user_id: userId,
    otp_code: otpCode,
  })
  return response.data.data
}

/**
 * 解绑 OTP
 * 解绑后 otp_secret 和 otp_enabled 都清空
 *
 * @returns 解绑结果
 */
export async function unbindOtp(): Promise<{ message: string }> {
  const response: AxiosResponse = await apiClient.post('/agents/otp-unbind')
  return response.data.data
}
