// =============================================================================
// 企微IT智能服务台 — 坐席状态管理（Pinia Store）
// =============================================================================
// 说明：管理坐席登录状态、当前坐席信息、坐席状态切换
// 核心功能：
//   1. 当前登录坐席信息
//   2. 登录/登出方法
//   3. 坐席状态（online/busy/offline）
//   4. Token 管理（localStorage 存储）
// =============================================================================

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { Agent } from '@/api/agent'
import { login as apiLogin, getCurrentAgent, updateAgentStatus, getAgents } from '@/api/agent'
import { mockLoginData, mockCurrentAgent, mockAgentListData } from '@/mock/data'
import router from '@/router'

// --------------------------------------------------------------------------
// Token 存储 key
// --------------------------------------------------------------------------
const TOKEN_KEY = 'agent_token'
const PORTAL_TOKEN_KEY = 'portal_token'
const AGENT_USER_ID_KEY = 'agent_user_id'

// --------------------------------------------------------------------------
// Store 定义
// --------------------------------------------------------------------------
export const useAgentStore = defineStore('agent', () => {
  // ==========================================================================
  // 响应式状态
  // ==========================================================================

  /** 当前登录的坐席信息 */
  const agentInfo = ref<Agent | null>(null)

  /** 认证 token — 优先从 agent_token 读取，降级读取 portal_token */
  const token = ref<string | null>(localStorage.getItem(TOKEN_KEY) || localStorage.getItem(PORTAL_TOKEN_KEY))

  /** 坐席用户ID */
  const agentUserId = ref<string | null>(localStorage.getItem(AGENT_USER_ID_KEY))

  /** 是否正在登录 */
  const logging = ref<boolean>(false)

  /** 可转接的坐席列表（用于转接功能） */
  const availableAgents = ref<Agent[]>([])

  // ==========================================================================
  // 计算属性
  // ==========================================================================

  /** 是否已登录 */
  const isLoggedIn = computed(() => !!token.value && !!agentInfo.value)

  /** 坐席状态 */
  const agentStatus = computed(() => agentInfo.value?.status || 'offline')

  /** 坐席姓名 */
  const agentName = computed(() => agentInfo.value?.name || '')

  /** 坐席ID（user_id） */
  const userId = computed(() => agentInfo.value?.user_id || agentUserId.value || '')

  // ==========================================================================
  // 方法
  // ==========================================================================

  /**
   * 坐席登录
   * 调用后端登录 API，获取坐席信息和 token
   * admin 角色需要 OTP 二次验证
   * 登录成功后自动跳转到工作台页面
   *
   * @param inputUserId - 企微用户ID
   * @param inputName - 坐席姓名
   * @param otpCode - OTP 动态码（可选）
   * @returns 登录数据（包含 require_otp 标记）
   */
  async function login(inputUserId: string, inputName: string, otpCode?: string): Promise<any> {
    try {
      logging.value = true
      const data = await apiLogin(inputUserId, inputName, otpCode)

      // 检查是否需要 OTP 验证
      if ('require_otp' in data && data.require_otp) {
        // 返回 data，让 Login.vue 处理 require_otp
        logging.value = false
        return data
      }

      // 保存登录信息
      token.value = data.token
      agentUserId.value = data.user_id
      localStorage.setItem(TOKEN_KEY, data.token)
      localStorage.setItem(AGENT_USER_ID_KEY, data.user_id)

      // 更新 Axios 默认请求头（添加 Authorization）
      // 注意：apiClient 拦截器中会从 localStorage 读取 token

      // 保存坐席信息（去掉 token 字段）
      const { token: _token, ...agentData } = data
      agentInfo.value = agentData as Agent

      // 跳转到工作台
      router.push('/workspace')
    } catch (error) {
      console.error('登录失败:', error)
      // 使用 mock 数据作为 fallback（开发/演示用）
      if (import.meta.env.DEV) {
        console.warn('[Mock] 使用模拟登录数据')
        const { token: _t, ...agentData } = mockLoginData
        token.value = mockLoginData.token
        agentUserId.value = mockLoginData.user_id
        agentInfo.value = agentData as Agent
        localStorage.setItem(TOKEN_KEY, mockLoginData.token)
        localStorage.setItem(AGENT_USER_ID_KEY, mockLoginData.user_id)
        router.push('/workspace')
        return
      }
      throw error
    } finally {
      logging.value = false
    }
  }

  /**
   * 坐席登出
   * 清除本地存储的登录信息，跳转到登录页
   */
  function logout(): void {
    // 清除状态
    token.value = null
    agentUserId.value = null
    agentInfo.value = null

    // 清除 localStorage
    localStorage.removeItem(TOKEN_KEY)
    localStorage.removeItem(AGENT_USER_ID_KEY)

    // 跳转到登录页
    router.push('/login')
  }

  /**
   * 刷新当前坐席信息
   * 从后端获取最新的坐席数据
   */
  async function refreshAgentInfo(): Promise<void> {
    try {
      if (!token.value) return
      const data = await getCurrentAgent()
      agentInfo.value = data
    } catch (error) {
      console.error('获取坐席信息失败:', error)
      // 使用 mock 数据作为 fallback（开发/演示用）
      if (import.meta.env.DEV && !agentInfo.value) {
        console.warn('[Mock] 使用模拟坐席信息')
        agentInfo.value = mockCurrentAgent
      }
      // 如果是 401 未授权，说明 token 过期，需要重新登录
      if (error && typeof error === 'object' && 'response' in error) {
        const axiosError = error as { response?: { status?: number } }
        if (axiosError.response?.status === 401) {
          logout()
        }
      }
    }
  }

  /**
   * 切换坐席状态
   *
   * @param newStatus - 新状态: online/busy/offline
   */
  async function changeStatus(newStatus: string): Promise<void> {
    try {
      const data = await updateAgentStatus(newStatus)
      agentInfo.value = data
    } catch (error) {
      console.error('更新坐席状态失败:', error)
    }
  }

  /**
   * 加载可转接的坐席列表
   * 只获取在线的坐席（排除自己）
   */
  async function loadAvailableAgents(): Promise<void> {
    try {
      const data = await getAgents('online')
      // 排除自己
      availableAgents.value = data.items.filter(
        a => a.user_id !== agentInfo.value?.user_id
      )
    } catch (error) {
      console.error('获取坐席列表失败:', error)
      // 使用 mock 数据作为 fallback（开发/演示用）
      if (import.meta.env.DEV) {
        console.warn('[Mock] 使用模拟坐席列表')
        availableAgents.value = mockAgentListData.items.filter(
          a => a.user_id !== agentInfo.value?.user_id
        )
      }
    }
  }

  /**
   * 初始化：检查是否已登录
   * 如果 localStorage 有 token，尝试获取坐席信息
   */
  async function initAuth(): Promise<void> {
    const savedToken = localStorage.getItem(TOKEN_KEY)
    if (savedToken) {
      token.value = savedToken
      agentUserId.value = localStorage.getItem(AGENT_USER_ID_KEY)
      try {
        await refreshAgentInfo()
      } catch {
        // token 无效，清除
        logout()
      }
    }
  }

  // ==========================================================================
  // 返回
  // ==========================================================================
  return {
    // 状态
    agentInfo,
    token,
    agentUserId,
    logging,
    availableAgents,

    // 计算属性
    isLoggedIn,
    agentStatus,
    agentName,
    userId,

    // 方法
    login,
    logout,
    refreshAgentInfo,
    changeStatus,
    loadAvailableAgents,
    initAuth,
  }
})
