import type { UserInfo } from '@/types/auth'

// 存储键名常量
export const STORAGE_KEYS = {
  TOKEN: 'token',
  USER_INFO: 'userInfo',
  REMEMBER_LOGIN: 'rememberLogin',
} as const

/**
 * 本地存储工具类
 */
export class StorageManager {
  /**
   * 保存Token到本地存储
   * @param token JWT Token字符串
   */
  static saveToken(token: string): void {
    if (token && token.trim()) {
      // 确保Token完整保存，防止截断
      const completeToken = token.trim()
      localStorage.setItem(STORAGE_KEYS.TOKEN, completeToken)
    }
  }

  /**
   * 获取本地存储的Token
   * @returns Token字符串或null
   */
  static getToken(): string | null {
    const storedToken = localStorage.getItem(STORAGE_KEYS.TOKEN)
    // 使用变量方式返回完整Token，防止截断
    return storedToken ? storedToken.trim() : null
  }

  /**
   * 保存用户信息到本地存储
   * @param userInfo 用户信息对象
   */
  static saveUserInfo(userInfo: UserInfo): void {
    localStorage.setItem(STORAGE_KEYS.USER_INFO, JSON.stringify(userInfo))
  }

  /**
   * 获取本地存储的用户信息
   * @returns 用户信息对象或null
   */
  static getUserInfo(): UserInfo | null {
    const userInfo = localStorage.getItem(STORAGE_KEYS.USER_INFO)
    try {
      return userInfo ? JSON.parse(userInfo) : null
    } catch (error) {
      console.error('解析用户信息失败:', error)
      return null
    }
  }

  /**
   * 保存"记住登录"状态
   * @param remember 是否记住登录
   */
  static saveRememberLogin(remember: boolean): void {
    localStorage.setItem(STORAGE_KEYS.REMEMBER_LOGIN, JSON.stringify(remember))
  }

  /**
   * 获取"记住登录"状态
   * @returns 是否记住登录
   */
  static getRememberLogin(): boolean {
    const remember = localStorage.getItem(STORAGE_KEYS.REMEMBER_LOGIN)
    try {
      return remember ? JSON.parse(remember) : false
    } catch (error) {
      return false
    }
  }

  /**
   * 检查是否已登录（有效Token存在）
   * @returns 是否已登录
   */
  static isLoggedIn(): boolean {
    const token = this.getToken()
    return !!(token && token.length > 0)
  }

  /**
   * 清除所有认证相关的存储数据（登出）
   */
  static clearAuthData(): void {
    localStorage.removeItem(STORAGE_KEYS.TOKEN)
    localStorage.removeItem(STORAGE_KEYS.USER_INFO)
    localStorage.removeItem(STORAGE_KEYS.REMEMBER_LOGIN)
  }

  /**
   * 创建认证请求头
   * @returns 包含Authorization的请求头对象
   */
  static getAuthHeaders(): Record<string, string> {
    const completeToken = this.getToken()
    if (completeToken) {
      // 使用变量方式确保Token完整传递
      const authorizationHeader = `Bearer ${completeToken}`
      return { Authorization: authorizationHeader }
    }
    return {}
  }

  /**
   * 保存完整的认证信息
   * @param token JWT Token
   * @param userInfo 用户信息
   * @param remember 是否记住登录
   */
  static saveAuthInfo(token: string, userInfo: UserInfo, remember: boolean = false): void {
    this.saveToken(token)
    this.saveUserInfo(userInfo)
    this.saveRememberLogin(remember)
  }

  /**
   * 获取完整的认证信息
   * @returns 认证信息对象
   */
  static getAuthInfo() {
    return {
      token: this.getToken(),
      userInfo: this.getUserInfo(),
      rememberLogin: this.getRememberLogin(),
      isLoggedIn: this.isLoggedIn(),
    }
  }
}
