import { reactive } from 'vue'
import { lotteryApi } from '../api/index.js'

// 用户状态管理
export const userStore = reactive({
  // 用户信息
  user: null,
  isLoggedIn: false,
  isKickedOut: false, // 标记是否被其他设备踢出
  lastCheckTime: null, // 最后一次检查登录状态的时间
  
  // 获取登录用户信息
  async fetchLoginUser() {
    try {
      const response = await lotteryApi.getLoginUser()
      if (response.success === true) {
        const userData = response.data
        // 更新用户信息，保留现有的本地数据结构
        this.user = {
          id: String(userData.id), // 确保ID始终为字符串，避免精度丢失
          username: userData.userName || userData.userAccount || userData.username || userData.name,
          email: userData.email,
          phone: userData.phone,
          nickname: userData.nickname || userData.userName || userData.userAccount || userData.username || userData.name,
          avatar: userData.userAvatar || userData.avatar || null,
          userType: userData.userType || 'trial',
          isVip: userData.isVip,
          expireDate: userData.vipExpire || userData.expireDate || '2025-06-30',
          registeredAt: userData.createTime || userData.registeredAt || new Date().toISOString(),
          status: userData.status !== undefined ? userData.status : 0, // 添加status字段，默认为0 (正常)
          stats: {
            predictCount: userData.stats?.predictCount || 0,
            hitCount: userData.stats?.hitCount || 0,
            hitRate: userData.stats?.hitRate || 0
          }
        }
        this.isLoggedIn = true
        
        // 保存到本地存储
        localStorage.setItem('user', JSON.stringify(this.user))
        localStorage.setItem('isLoggedIn', 'true')
        
        return this.user
      } else {
        console.error('获取用户信息失败:', response.message)
        this.logout()
        return null
      }
    } catch (error) {
      console.error('获取用户信息出错:', error)
      this.logout()
      return null
    }
  },
  
  // 登录
  login(userInfo) {
    this.user = {
      id: userInfo.id || Date.now(),
      username: userInfo.username,
      email: userInfo.email,
      phone: userInfo.phone,
      nickname: userInfo.nickname || userInfo.username,
      avatar: userInfo.avatar || null,
      userType: userInfo.userType || 'trial', // trial: 体验版, premium: 正式版
      expireDate: userInfo.expireDate || '2025-06-30',
      registeredAt: userInfo.registeredAt || new Date().toISOString(),
      stats: {
        predictCount: userInfo.stats?.predictCount || 0,
        hitCount: userInfo.stats?.hitCount || 0,
        hitRate: userInfo.stats?.hitRate || 0
      }
    }
    this.isLoggedIn = true
    this.isKickedOut = false // 重置被踢出状态
    this.lastCheckTime = Date.now() // 记录登录时间
    
    // 保存到本地存储
    localStorage.setItem('user', JSON.stringify(this.user))
    localStorage.setItem('isLoggedIn', 'true')
  },
  
  // 登出
  logout(isKickedOut = false) {
    // 如果是被踢出，标记状态
    if (isKickedOut) {
      this.isKickedOut = true
      console.log('[安全] 账号在其他设备登录，当前会话已被踢出')
    }
    
    this.user = null;
    this.isLoggedIn = false;
    this.lastCheckTime = null;
    
    // 清除所有本地存储的用户信息
    localStorage.removeItem('user');
    localStorage.removeItem('userInfo');
    localStorage.removeItem('isLoggedIn');
    
    // 清除可能存在的其他相关存储
    sessionStorage.removeItem('user');
    sessionStorage.removeItem('userInfo');
    sessionStorage.removeItem('isLoggedIn');
  },
  
  // 更新用户信息
  updateUser(updates) {
    if (this.user) {
      Object.assign(this.user, updates)
      localStorage.setItem('user', JSON.stringify(this.user))
    }
  },
  
  // 从本地存储恢复用户状态
  restoreFromStorage() {
    const savedUser = localStorage.getItem('user')
    const savedLoginState = localStorage.getItem('isLoggedIn')
    
    if (savedUser && savedLoginState === 'true') {
      const user = JSON.parse(savedUser)
      // 确保ID始终为字符串，避免精度丢失
      if (user.id) {
        user.id = String(user.id)
      }
      this.user = user
      this.isLoggedIn = true
    }
  },
  
  // 更新用户统计
  updateStats(stats) {
    if (this.user) {
      this.user.stats = { ...this.user.stats, ...stats }
      localStorage.setItem('user', JSON.stringify(this.user))
    }
  },
  
  // 检查用户是否为付费用户
  isPremiumUser() {
    return this.user?.userType === 'premium'
  },
  
  // 获取用户ID
  getUserId() {
    return this.user?.id
  },
  
  // 设置用户信息（用于管理员登录）
  setUserInfo(userInfo) {
    this.user = {
      id: String(userInfo.id), // 确保ID始终为字符串，避免精度丢失
      username: userInfo.userAccount || userInfo.userName,
      nickname: userInfo.userName || userInfo.userAccount,
      avatar: userInfo.avatar || null,
      userRole: userInfo.userRole || 'user',
      status: userInfo.status !== undefined ? userInfo.status : 0, // 添加status字段，默认为0 (正常)
      createTime: userInfo.createTime || new Date().toISOString()
    }
    this.isLoggedIn = true
    
    // 使用sessionStorage而不是localStorage存储管理员登录状态
    sessionStorage.setItem('adminInfo', JSON.stringify(this.user))
    sessionStorage.setItem('adminLoggedIn', 'true')
  },
  
  // 获取用户信息
  getUserInfo() {
    // 如果内存中有用户信息，直接返回
    if (this.user) {
      return this.user;
    }
    
    // 尝试从sessionStorage中获取管理员信息
    const adminInfo = sessionStorage.getItem('adminInfo');
    if (adminInfo) {
      try {
        const parsedAdminInfo = JSON.parse(adminInfo);
        // 将解析后的信息赋值给this.user，确保内存中也有
        this.user = parsedAdminInfo;
        return parsedAdminInfo;
      } catch (e) {
        console.error('解析管理员信息失败:', e);
      }
    }
    
    // 尝试从localStorage中获取普通用户信息
    const userInfo = localStorage.getItem('userInfo');
    if (userInfo) {
      try {
        return JSON.parse(userInfo);
      } catch (e) {
        console.error('解析用户信息失败:', e);
      }
    }
    
    // 如果都没有，返回空对象
    return {};
  },
  
  // 检查管理员是否已登录
  isAdminLoggedIn() {
    return sessionStorage.getItem('adminLoggedIn') === 'true'
  },
  
  // 管理员登出
  adminLogout(isKickedOut = false) {
    // 如果是被踢出，标记状态
    if (isKickedOut) {
      this.isKickedOut = true
      console.log('[安全] 管理员账号在其他设备登录，当前会话已被踢出')
    }
    
    this.user = null;
    this.isLoggedIn = false;
    this.lastCheckTime = null;
    
    // 清除所有session存储的管理员信息
    sessionStorage.removeItem('adminInfo');
    sessionStorage.removeItem('adminLoggedIn');
  },
  
  // 主动检查登录状态是否有效
  async checkLoginStatus() {
    // 如果没有登录，直接返回
    if (!this.isLoggedIn) {
      return { valid: false, reason: 'not_logged_in' }
    }
    
    // 避免频繁检查（10秒内只检查一次）
    const now = Date.now()
    if (this.lastCheckTime && (now - this.lastCheckTime) < 10000) {
      return { valid: true, reason: 'recently_checked' }
    }
    
    try {
      // 调用后端接口验证登录状态
      const response = await lotteryApi.getLoginUser()
      
      if (response.success === true) {
        // 登录状态有效，更新检查时间
        this.lastCheckTime = now
        this.isKickedOut = false
        return { valid: true, reason: 'verified' }
      } else {
        // 检查是否是被踢出
        const message = response.message || ''
        if (message.includes('其他设备登录') || message.includes('当前会话已失效')) {
          this.logout(true) // 标记为被踢出
          return { valid: false, reason: 'kicked_out', message }
        } else {
          this.logout(false)
          return { valid: false, reason: 'session_expired', message }
        }
      }
    } catch (error) {
      console.error('[Store] 检查登录状态失败:', error)
      // 网络错误等情况，不清除登录状态，让用户继续使用
      return { valid: true, reason: 'check_failed', error }
    }
  },
  
  // 重置被踢出状态（用于重新登录后）
  resetKickedOutStatus() {
    this.isKickedOut = false
  }
})

// 初始化时从本地存储恢复状态
// 检查是否有管理员登录信息，优先恢复管理员状态
const adminInfo = sessionStorage.getItem('adminInfo');
if (adminInfo) {
  try {
    userStore.user = JSON.parse(adminInfo);
    userStore.isLoggedIn = true;
  } catch (e) {
    console.error('恢复管理员状态失败:', e);
    // 如果管理员信息恢复失败，尝试恢复普通用户状态
    userStore.restoreFromStorage();
  }
} else {
  // 没有管理员信息，尝试恢复普通用户状态
  userStore.restoreFromStorage();
} 