/**
 * 用户状态管理模块
 * 使用Pinia实现的用户状态管理，负责管理用户的登录状态、认证token和用户信息
 */

// 导入Pinia的store定义函数
import { defineStore } from 'pinia'

// 导入Axios用于API请求
import axios from 'axios'

/**
 * 用户状态管理store定义
 * 使用Pinia的defineStore函数创建用户状态管理模块
 * @returns {Object} - 用户store实例，提供用户状态管理的各种方法和属性
 */
export const useUserStore = defineStore('user', {
  /**
   * 状态定义
   * 初始化用户相关的状态数据
   */
  state: () => ({
    token: '', // 用户认证令牌，用于API请求认证
    userInfo: null, // 用户详细信息对象
    menuList: [] // 用户可访问的菜单列表
  }),
  
  /**
   * 计算属性（getters）
   * 提供基于state的派生状态，用于获取用户登录状态等信息
   */
  getters: {
    /**
     * 检查用户是否已登录
     * @param {Object} state - store当前状态
     * @returns {boolean} - 用户是否已登录的布尔值
     */
    isLoggedIn: (state) => !!state.token
  },
  
  /**
   * 动作方法（actions）
   * 提供修改状态的方法，包括登录、登出和初始化用户信息
   */
  actions: {
    /**
     * 用户登录方法
     * 处理用户登录请求，保存登录状态和用户信息
     * @param {Object} credentials - 用户登录凭据，包含用户名和密码等信息
     * @returns {Promise<Object>} - 登录结果对象，包含成功状态和错误信息
     */
    async login(credentials) {
      try {
        // 模拟登录请求
        const response = await axios.post('/api/login', credentials)
        const { token, userInfo, menuList } = response.data
        
        this.token = token // 保存token到状态
        this.userInfo = userInfo // 保存用户信息
        this.menuList = menuList // 保存菜单列表
        
        // 保存token到localStorage
        localStorage.setItem('token', token)
        
        return { success: true }
      } catch (error) {
        console.error('登录失败:', error)
        return { success: false, message: error.response?.data?.message || '登录失败' }
      }
    },
    
    /**
     * 用户登出方法
     * 清除用户所有状态信息并移除本地存储的token
     */
    logout() {
      this.token = '' // 清除token
      this.userInfo = null // 清除用户信息
      this.menuList = [] // 清除菜单列表
      localStorage.removeItem('token') // 移除本地存储的token
    },
    
    /**
     * 初始化用户信息方法
     * 从本地存储恢复用户登录状态并获取最新用户信息
     * @returns {Promise<void>} - 初始化过程的Promise
     */
    async initUserInfo() {
      const token = localStorage.getItem('token')
      if (token) {
        this.token = token
        try {
          // 模拟获取用户信息
          const response = await axios.get('/api/user/info')
          this.userInfo = response.data.userInfo // 保存用户信息
          this.menuList = response.data.menuList // 保存菜单列表
        } catch (error) {
          console.error('获取用户信息失败:', error)
          this.logout() // 失败时自动登出
        }
      }
    }
  }
})