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

export const useUserStore = defineStore('user', () => {
  // 状态
  const token = ref(localStorage.getItem('token') || '')
  const userData = ref(JSON.parse(localStorage.getItem('user') || 'null'))
  const isLoggedIn = computed(() => !!token.value)

  // 检查登录状态
  function checkLoginStatus() {
    const savedToken = localStorage.getItem('token')
    const savedUser = localStorage.getItem('user')
    
    if (savedToken && savedUser) {
      try {
        token.value = savedToken
        userData.value = JSON.parse(savedUser)
        return true
      } catch (error) {
        console.error('解析用户数据失败', error)
        logout()
        return false
      }
    }
    return false
  }

  // 检查token是否有效
  async function validateToken() {
    if (!token.value) {
      return false
    }
    
    try {
      const { api } = await import('../utils/api')
      // 尝试调用一个需要认证的API来验证token
      await api.get('/auth/validate')
      return true
    } catch (error) {
      if (error.message && error.message.includes('认证已过期')) {
        logout()
        return false
      }
      // 其他错误可能是网络问题，不清除token
      return true
    }
  }

  // 登录操作
  async function login(username, password, retryCount = 0) {
    try {
      const { api } = await import('../utils/api');
      // 使用专门的login方法，它返回完整的响应对象
      const result = await api.login(username, password);
      
      // 登录成功后设置token和用户数据
      if (result.success && result.token) {
        token.value = result.token;
        userData.value = {
          id: result.user?.id,
          username: result.user?.username || username,
          email: result.user?.email || `${username}@example.com`,
          role: result.role || result.user?.role,
          permissions: result.permissions || result.user?.permissions || [],
          accessibleMenus: result.accessibleMenus || result.user?.accessibleMenus || []
        };
        
        // 保存到本地存储
        localStorage.setItem('token', result.token);
        localStorage.setItem('user', JSON.stringify(userData.value));

        // 建立WebSocket连接
        // await connectWebSocket();
      }
      
      return result;
    } catch (error) {
      console.error('登录错误:', error);
      // 重试逻辑（仅对500错误且重试次数<2）
      if (error.message.includes('500') && retryCount < 2) {
        return login(username, password, retryCount + 1);
      }
      // 直接抛出错误，由调用方处理
      throw error;
    }
  }

  // WebSocket连接状态
  // const isWebSocketConnected = ref(false)

  // 建立WebSocket连接
  // async function connectWebSocket() {
  //   if (!token.value) {
  //     console.log('无token，跳过WebSocket连接')
  //     return
  //   }

  //   try {
  //     const webSocketService = await import('../utils/websocketService')
  //     webSocketService.default.connect(token.value)
  //     isWebSocketConnected.value = true
  //     console.log('WebSocket连接已建立')
  //   } catch (error) {
  //     console.error('WebSocket连接失败:', error)
  //     isWebSocketConnected.value = false
  //   }
  // }

  // 断开WebSocket连接
  // async function disconnectWebSocket() {
  //   try {
  //     const webSocketService = await import('../utils/websocketService')
  //     webSocketService.default.disconnect()
  //     isWebSocketConnected.value = false
  //     console.log('WebSocket连接已断开')
  //   } catch (error) {
  //     console.error('断开WebSocket连接失败:', error)
  //   }
  // }

  // 登出操作
  async function logout() {
    // 断开WebSocket连接
    // await disconnectWebSocket()
    
    token.value = ''
    userData.value = null
    
    // 清除本地存储
    localStorage.removeItem('token')
    localStorage.removeItem('user')
  }

  // 更新用户信息
  function updateUserInfo(newUserInfo) {
    userData.value = { ...userData.value, ...newUserInfo }
    localStorage.setItem('user', JSON.stringify(userData.value))
  }

  // 权限检查方法
  function hasPermission(permission) {
    console.log('检查权限:', permission)
    console.log('用户数据:', userData.value)
    console.log('用户权限:', userData.value?.permissions)
    
    if (!userData.value || !userData.value.permissions) {
      console.log('无用户数据或权限，返回false')
      return false
    }
    
    if (Array.isArray(permission)) {
      const hasAny = permission.some(p => userData.value.permissions.includes(p))
      console.log('权限数组检查结果:', permission, hasAny)
      return hasAny
    }
    
    const hasPerm = userData.value.permissions.includes(permission)
    console.log('单个权限检查结果:', permission, hasPerm)
    return hasPerm
  }

  // 角色检查方法
  function hasRole(role) {
    console.log('检查角色:', role)
    console.log('用户角色:', userData.value?.role)
    
    if (!userData.value || !userData.value.role) {
      console.log('无用户数据或角色，返回false')
      return false
    }
    
    if (Array.isArray(role)) {
      const hasAny = role.includes(userData.value.role.name)
      console.log('角色数组检查结果:', role, hasAny)
      return hasAny
    }
    
    const hasRole = userData.value.role.name === role
    console.log('单个角色检查结果:', role, hasRole)
    return hasRole
  }

  // 检查是否可以访问菜单
  function canAccessMenu(menuKey) {
    console.log('检查菜单访问:', menuKey)
    console.log('可访问菜单:', userData.value?.accessibleMenus)
    
    if (!userData.value) {
      console.log('无用户数据，返回false')
      return false
    }
    
    // 如果没有accessibleMenus数组，返回false
    if (!Array.isArray(userData.value.accessibleMenus)) {
      console.log('可访问菜单不是数组，返回false')
      return false
    }
    
    // 如果accessibleMenus为空数组，返回false（没有菜单权限）
    if (userData.value.accessibleMenus.length === 0) {
      console.log('可访问菜单为空数组，返回false')
      return false
    }
    
    const canAccess = userData.value.accessibleMenus.includes(menuKey)
    console.log('菜单访问检查结果:', menuKey, canAccess)
    return canAccess
  }

  // 获取用户角色名称
  function getUserRoleName() {
    return userData.value?.role?.name || 'user'
  }

  // 获取用户权限列表
  function getUserPermissions() {
    return userData.value?.permissions || []
  }

  return {
    token,
    userData,
    isLoggedIn,
    // isWebSocketConnected,
    checkLoginStatus,
    validateToken,
    login,
    logout,
    updateUserInfo,
    // connectWebSocket,
    // disconnectWebSocket,
    hasPermission,
    hasRole,
    canAccessMenu,
    getUserRoleName,
    getUserPermissions
  }
})