// =============================================================================
// 企微IT智能服务台 — H5用户端员工API  
// =============================================================================
// 说明：封装员工认证和身份信息相关的 API 方法
//   1. OAuth2 授权回调（code 换取 token + 用户信息）
//   2. 获取当前员工详细信息
//   3. 获取 OAuth2 授权 URL
//   4. Mock 登录（测试阶段，跳过 OAuth2）
// =============================================================================

import apiClient from '@/api'

// -------------------------------------------------------------------------  
// 类型定义
// -------------------------------------------------------------------------  

/** OAuth2 回调请求参数 */
export interface OAuthCallbackRequest {
  /** 企微 OAuth2 授权码 */
  code: string
  /** 企微 OAuth2 state 参数（可选） */
  state?: string
}

/** OAuth2 回调返回数据 */
export interface OAuthCallbackResponse {
  /** 员工 ID */
  employee_id: string
  /** 员工姓名 */
  employee_name: string
  /** 访问令牌 */
  token: string
  /** 部门名称 */
  department: string
  /** 岗位 */
  position: string
  /** 头像 URL */
  avatar: string
}

/** 员工详细信息 */
export interface EmployeeInfo {
  /** 员工 ID */
  employee_id: string
  /** 员工姓名 */
  employee_name: string
  /** 部门名称 */
  department: string
  /** 岗位 */
  position: string
  /** 手机号 */
  mobile: string
  /** 邮箱 */
  email: string
  /** 头像 URL */
  avatar: string
  /** 是否 VIP 员工 */
  is_vip: boolean
}

/** OAuth2 授权URL响应 */
export interface OAuthAuthorizeResponse {
  /** 企微OAuth2授权URL */
  authorize_url: string
}

// -------------------------------------------------------------------------  
// API 方法
// -------------------------------------------------------------------------  
// 注意：响应拦截器返回 response.data（即 {code, data, message} 包装对象）
// API 函数通过 await + response.data 取出业务数据（与原始工作代码一致）
// -------------------------------------------------------------------------  

/**
 * OAuth2 授权回调
 * 将企微 OAuth2 授权码传给后端，换取员工身份和访问令牌
 * 成功后保存 token 和基本信息到 localStorage
 *
 * @param data 包含 code 和可选 state 的请求参数
 * @returns 员工身份信息（employee_id, employee_name, token 等）
 * @throws 授权失败时抛出异常
 */
export async function oauthCallback(data: OAuthCallbackRequest): Promise<OAuthCallbackResponse> {
  const response: any = await apiClient.post('/h5/oauth/callback', data)
  // response = {code:0, data: {token:"...", ...}, message:"success"}（拦截器返回值）
  // response.data = 业务数据 {token:"...", employee_id:"...", ...}
  return response.data
}

/**
 * Mock 登录（测试阶段，跳过 OAuth2）
 * 直接通过员工 ID 获取真实的 Bearer Token
 * 仅当后端 MOCK_LOGIN_ENABLED=true 时可用
 *
 * @param data 包含 employee_id 和 employee_name 的请求参数
 * @returns 员工身份信息（employee_id, employee_name, token 等）
 * @throws 登录失败时抛出异常
 */
export async function mockLogin(data: { employee_id: string; employee_name?: string }): Promise<OAuthCallbackResponse> {
  const response: any = await apiClient.post('/h5/mock-login', data)
  return response.data
}

/**
 * 获取当前员工详细信息
 * 返回当前登录员工的详细信息（姓名、部门、岗位、手机号、邮箱等）
 * 需要携带有效的 Bearer Token
 * @returns 员工详细信息对象
 */
export async function getEmployeeInfo(): Promise<EmployeeInfo> {
  const response: any = await apiClient.get('/h5/me')
  return response.data
}

/**
 * 获取企微 OAuth2 授权 URL
 * 返回完整的授权链接，前端跳转到该链接进行静默授权
 * @returns 包含 authorize_url 的响应对象
 */
export async function getOAuthAuthorizeUrl(): Promise<OAuthAuthorizeResponse> {
  // 传入 redirect_uri 确保后端构造正确的回调地址（而非默认的 /h5/）
  const redirectUri = window.location.origin + '/itdesk/'
  const response: any = await apiClient.get('/h5/oauth/authorize', {
    params: { redirect_uri: redirectUri },
  })
  return response.data
}
