import { defineStore } from 'pinia'
import { getCurrentUser, getUserPointsBalance } from '../api/user'

export const useUserStore = defineStore('user', {
  state: () => ({
    // 用户信息
    userInfo: null,
    // JWT token
    token: null,
    // 是否已登录
    isLoggedIn: false,
    // 控制登录弹窗的显示
    showLoginModal: false
  }),

  getters: {
    // 获取用户信息
    getUserInfo: (state) => state.userInfo,
    // 获取token
    getToken: (state) => state.token,
    // 检查是否已登录
    getIsLoggedIn: (state) => state.isLoggedIn,
    // 获取登录弹窗显示状态
    getShowLoginModal: (state) => state.showLoginModal
  },

  actions: {
    // 设置登录弹窗的显示状态
    setShowLoginModal(shouldShow) {
      this.showLoginModal = shouldShow
    },

    // 设置用户信息
    setUserInfo(userInfo) {
      this.userInfo = userInfo
      this.isLoggedIn = true
    },

    // 设置token
    setToken(token) {
      this.token = token
    },

    // 登录成功后调用
    login(userInfo, token) {
      this.setUserInfo(userInfo)
      this.setToken(token)
    },

    // 登出
    logout() {
      // 清空状态数据
      this.userInfo = null
      this.token = null
      this.isLoggedIn = false
      
      // 清空localStorage中的持久化数据
      if (typeof localStorage !== 'undefined') {
        localStorage.removeItem('user-store')
        
        // 清空可能存在的其他用户相关数据
        const keysToRemove = []
        for (let i = 0; i < localStorage.length; i++) {
          const key = localStorage.key(i)
          if (key && (key.includes('user') || key.includes('token') || key.includes('auth'))) {
            keysToRemove.push(key)
          }
        }
        keysToRemove.forEach(key => localStorage.removeItem(key))
      }
      
      // 清空sessionStorage
      if (typeof sessionStorage !== 'undefined') {
        sessionStorage.clear()
      }
      
      console.log('状态管理：用户数据已完全清空')
    },

    // 更新用户信息
    updateUserInfo(userInfo) {
      console.log('UserStore: 更新用户信息，当前用户信息:', this.userInfo)
      console.log('UserStore: 新的用户信息:', userInfo)
      
      if (this.userInfo) {
        // 使用 Object.assign 确保响应式更新，同时保留现有有效值
        Object.assign(this.userInfo, userInfo)
      } else {
        this.userInfo = userInfo
      }
      
      console.log('UserStore: 更新后的用户信息:', this.userInfo)
    },

    // 清除token
    clearToken() {
      this.token = null
    },

    // 从服务器获取最新的用户信息
    async fetchUserInfo() {
      try {
        console.log('UserStore: 开始获取最新用户信息...')
        const response = await getCurrentUser()
        
        if (response.code === 200 && response.data) {
          console.log('UserStore: 获取用户信息成功:', response.data)
          this.updateUserInfo(response.data)
          return response.data
        } else {
          console.error('UserStore: 获取用户信息失败，响应码:', response.code)
          throw new Error(response.message || '获取用户信息失败')
        }
      } catch (error) {
        console.error('UserStore: 获取用户信息异常:', error)
        throw error
      }
    },

    // 刷新用户积分和消费余额
    async fetchUserPoints() {
      try {
        console.log('UserStore: 开始获取用户积分...')
        const response = await getUserPointsBalance()
        
        if (response.code === 200 && response.data) {
          console.log('UserStore: 获取用户积分成功:', response.data)
          // 更新用户信息中的积分
          if (this.userInfo) {
            this.userInfo.points = response.data.currentPoints
            this.userInfo.pointsExpiresAt = response.data.pointsExpiresAt
            this.userInfo.willExpireSoon = response.data.willExpireSoon
            this.userInfo.daysUntilExpire = response.data.daysUntilExpire
          }
          return response.data
        } else {
          console.error('UserStore: 获取用户积分失败，响应码:', response.code)
          throw new Error(response.message || '获取用户积分失败')
        }
      } catch (error) {
        console.error('UserStore: 获取用户积分异常:', error)
        throw error
      }
    }
  },

  // 持久化配置
  persist: {
    key: 'user-store',
    storage: localStorage,
    paths: ['userInfo', 'token', 'isLoggedIn']
  }
}) 