// =============================================================================
// 企微IT智能服务台 — 管理员状态管理（Pinia Store）
// =============================================================================
// 说明：管理管理员登录状态、当前管理员信息、权限校验
// 核心功能：
//   1. 当前管理员信息
//   2. 登录/登出方法
//   3. Admin 角色校验
//   4. Token 管理（localStorage.admin_token）

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { Agent } from '@/types'
import apiClient from '@/api/index'
import router from '@/router'

// --------------------------------------------------------------------------
// Token 存储 key（管理后台使用 admin_token，与坐席端 agent_token 隔离）
// --------------------------------------------------------------------------
const TOKEN_KEY = 'admin_token'
const ADMIN_USER_ID_KEY = 'admin_user_id'

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

  /** 当前管理员信息 */
  const adminInfo = ref<Agent | null>(null)

  /** 认证 token */
  const token = ref<string | null>(localStorage.getItem(TOKEN_KEY))

  /** 管理员用户ID */
  const adminUserId = ref<string | null>(localStorage.getItem(ADMIN_USER_ID_KEY))

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

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

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

  /** 管理员姓名 */
  const adminName = computed(() => adminInfo.value?.name || '')

  /** 管理员用户ID */
  const userId = computed(() => adminInfo.value?.user_id || adminUserId.value || '')

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

  /**
   * 管理员登录
   * 复用坐席端登录 API（POST /api/agents/login），但额外校验 role === 'admin'
   *
   * @param inputUserId - 企微用户ID
   * @param inputName - 管理员姓名
   */
  async function login(inputUserId: string, inputName: string): Promise<void> {
    logging.value = true
    try {
      const response = await apiClient.post('/agents/login', {
        user_id: inputUserId,
        name: inputName,
      })

      const data = response.data.data
      const agentInfoData = data.agent_info || data

      // 校验角色是否为管理员
      if (agentInfoData.role !== 'admin') {
        throw new Error('无管理权限：该账号非管理员角色')
      }

      // 保存登录信息
      token.value = data.token || agentInfoData.token
      adminUserId.value = inputUserId
      localStorage.setItem(TOKEN_KEY, data.token || agentInfoData.token)
      localStorage.setItem(ADMIN_USER_ID_KEY, inputUserId)

      // 保存管理员信息
      adminInfo.value = {
        ...agentInfoData,
        role: 'admin',
      } as Agent

      // 跳转到仪表盘
      router.push('/dashboard')
    } catch (error: unknown) {
      console.error('管理员登录失败:', error)
      const errMsg = error instanceof Error ? error.message : '登录失败，请重试'
      throw new Error(errMsg)
    } finally {
      logging.value = false
    }
  }

  /**
   * 管理员登出
   * 清除本地存储的登录信息，跳转到登录页
   */
  function logout(): void {
    // 清除状态
    token.value = null
    adminUserId.value = null
    adminInfo.value = null

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

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

  /**
   * 刷新当前管理员信息
   * 从后端获取最新的管理员数据
   */
  async function refreshAdminInfo(): Promise<void> {
    try {
      if (!token.value) return
      const response = await apiClient.get('/agents/me')
      adminInfo.value = response.data.data
    } catch (error) {
      console.error('获取管理员信息失败:', error)
      // 如果是 401 未授权，说明 token 过期，需要重新登录
      if (error && typeof error === 'object' && 'response' in error) {
        const axiosError = error as { response?: { status?: number } }
        if (axiosError.response?.status === 401) {
          logout()
        }
      }
    }
  }

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

  // ==========================================================================
  // 返回
  // ==========================================================================
  return {
    // 状态
    adminInfo,
    token,
    adminUserId,
    logging,

    // 计算属性
    isLoggedIn,
    adminName,
    userId,

    // 方法
    login,
    logout,
    refreshAdminInfo,
    initAuth,
  }
})
