import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

// 用户信息接口（根据后端User实体类定义）
export interface UserInfo {
  id: number
  username: string // 登录账号(email)
  password?: string // 不在前端显示
  nickname: string // 昵称/姓名
  role: number // 用户角色（1=管理员 2=赛事服务人员 3=普通用户）
  status: number // 状态（0=禁用 1=启用）
  lastLoginTime?: number // 最后登录时间（秒级时间戳）
  createTime: number // 创建时间（秒级时间戳）
  updateTime: number // 更新时间（秒级时间戳）
  age?: number // 年龄
  gender?: number // 性别（0=未知 1=男 2=女）
  contact?: string // 联系方式（手机号/邮箱/微信等）
  salt?: string // 密码盐（不在前端显示）
  avatar?: string // 用户头像URL
  inviteQrCode?: string // 注册邀请二维码（后端返回的Base64字符串，可能不含前缀）
}

// 登录响应接口（只返回token）
export interface LoginResponse {
  token: string // 后端只返回token
}

export const useAuthStore = defineStore('auth', () => {
  // 状态
  const token = ref<string>('') // 简化为只存储token
  const userInfo = ref<UserInfo | null>(null)

  // 计算属性
  const isLoggedIn = computed(() => !!token.value && !!userInfo.value)

  // 用户权限检查（根据新的role字段）
  const hasRole = computed(() => (roleCode: number) => {
    return userInfo.value?.role === roleCode || false
  })

  const isAdmin = computed(() => userInfo.value?.role === 1) // 管理员
  const isStaff = computed(() => userInfo.value?.role === 2) // 赛事服务人员
  const isUser = computed(() => userInfo.value?.role === 3) // 普通用户
  const isActive = computed(() => userInfo.value?.status === 1) // 账号是否启用

  // Actions
  
  // 设置token信息
  function setToken(tokenValue: string) {

    token.value = tokenValue
    // 保存到localStorage
    localStorage.setItem('access_token', tokenValue)
  }

  // 设置用户信息
  function setUserInfo(info: UserInfo) {
    userInfo.value = info
    // 保存到localStorage
    localStorage.setItem('user_info', JSON.stringify(info))
  }

  // 设置登录信息（只有token）
  function setAuthInfo(tokenValue: string) {
    setToken(tokenValue)
    // 注意：登录时只设置token，用户信息需要单独获取
  }

  // 从localStorage加载数据
  function loadFromStorage() {
    const storedToken = localStorage.getItem('access_token')
    const storedUserInfo = localStorage.getItem('user_info')

    // 如果有 token 但没有 userInfo，清除无效的 token
    if (storedToken && !storedUserInfo) {
      console.warn('⚠️ 发现无效的token（缺少用户信息），已清除')
      localStorage.removeItem('access_token')
      return
    }

    // 如果有 userInfo 但没有 token，清除无效的 userInfo
    if (!storedToken && storedUserInfo) {
      console.warn('⚠️ 发现无效的用户信息（缺少token），已清除')
      localStorage.removeItem('user_info')
      return
    }

    // 两者都存在时才加载
    if (storedToken && storedUserInfo) {
      token.value = storedToken
      
      try {
        userInfo.value = JSON.parse(storedUserInfo)
        console.log('✅ 成功加载用户登录状态')
      } catch (error) {
        console.error('❌ 解析用户信息失败:', error)
        clearAuthInfo()
      }
    }
  }

  // 清除token信息
  function clearToken() {
    token.value = ''
    localStorage.removeItem('access_token')
  }

  // 清除用户信息
  function clearUserInfo() {
    userInfo.value = null
    localStorage.removeItem('user_info')
  }

  // 清除所有认证信息和相关缓存
  function clearAuthInfo() {
    clearToken()
    clearUserInfo()
    
    // 清除其他相关的缓存项
    localStorage.removeItem('redirect_after_login') // 清除登录后重定向路径
    localStorage.removeItem('user_preferences') // 清除用户偏好设置
    localStorage.removeItem('remember_me') // 清除记住我状态
    
    // 清除会话存储
    sessionStorage.clear()
    
    console.log('✅ 已清除所有认证信息和缓存')
  }

  // 获取用户信息（在登录后调用）
  async function fetchUserInfo(): Promise<boolean> {
    console.log('获取用户信息:', token.value)
    if (!token.value) {
      return false
    }

    console.log('获取用户信息:', token.value)

    try {
      // 动态导入authAPI避免循环依赖
      const { authAPI } = await import('@/api')
      const response = await authAPI.getProfile()
      
      if (response.code === 200) {
        setUserInfo(response.data)
        return true
      } else {
        console.error('获取用户信息失败:', response.message)
        return false
      }
    } catch (error) {
      console.error('获取用户信息失败:', error)
      return false
    }
  }

  // 获取token用于请求头
  function getAuthHeader(): string {
    return token.value
  }

  // 获取用户头像URL
  function getAvatarUrl(): string {
    // 优先使用用户上传的头像
    if (userInfo.value?.avatar) {
      return userInfo.value.avatar
    }
    
    // 如果没有上传头像，根据性别返回不同的默认头像
    if (userInfo.value?.gender === 1) {
      return '/default-avatar-male.png' // 男性默认头像
    } else if (userInfo.value?.gender === 2) {
      return '/default-avatar-female.png' // 女性默认头像
    }
    
    // 默认头像
    return '/default-avatar.png'
  }

  // 更新用户信息
  function updateUserInfo(updates: Partial<UserInfo>) {
    if (userInfo.value) {
      userInfo.value = { ...userInfo.value, ...updates }
      setUserInfo(userInfo.value)
    }
  }

  // 初始化，从localStorage加载数据
  function init() {
    loadFromStorage()
  }

  return {
    // 状态
    token,
    userInfo,
    
    // 计算属性
    isLoggedIn,
    hasRole,
    isAdmin,
    isStaff,
    isUser,
    isActive,
    
    // 方法
    setToken,
    setUserInfo,
    setAuthInfo,
    loadFromStorage,
    clearToken,
    clearUserInfo,
    clearAuthInfo,
    fetchUserInfo,
    getAuthHeader,
    getAvatarUrl,
    updateUserInfo,
    init
  }
})
