/**
 * Token 状态管理
 *
 * 基于 Pinia 的 Token 持久化 Store，
 * 封装 localStorage 中 Token 的读取、写入、清除操作。
 * 配合 axios 请求拦截器实现自动附加 Token。
 *
 * @module stores/token
 */

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

/** localStorage 中存储 Token 的键名 */
const TOKEN_KEY = 'Authorization'

/**
 * Token Store
 *
 * 管理登录凭证 Token 的持久化存储。
 * - token：当前 Token 值（响应式）
 * - hasToken：是否已存在 Token（计算属性）
 * - setToken：存储 Token 到 localStorage 并同步到 Store
 * - getToken：从 localStorage 读取 Token 并同步到 Store
 * - clearToken：清除 localStorage 和 Store 中的 Token
 */
export const useTokenStore = defineStore('token', () => {
  // ══════════════════════════════════════════════
  // State
  // ══════════════════════════════════════════════

  /** 当前存储的 Token 值 */
  const token = ref<string | null>(localStorage.getItem(TOKEN_KEY))

  // ══════════════════════════════════════════════
  // Getters
  // ══════════════════════════════════════════════

  /**
   * 是否已存在有效的 Token
   * @returns 如果 Token 存在且非空返回 true
   */
  const hasToken = computed<boolean>(() => {
    return token.value !== null && token.value !== ''
  })

  // ══════════════════════════════════════════════
  // Actions
  // ══════════════════════════════════════════════

  /**
   * 设置 Token
   *
   * 将 Token 写入 localStorage 并同步更新 Store 中的响应式状态。
   *
   * @param value - Token 字符串
   */
  function setToken(value: string): void {
    token.value = value
    localStorage.setItem(TOKEN_KEY, value)
  }

  /**
   * 获取 Token
   *
   * 从 localStorage 读取 Token 并同步到 Store 状态。
   * 通常在应用初始化时调用。
   *
   * @returns 当前的 Token 值，不存在时返回 null
   */
  function getToken(): string | null {
    const stored = localStorage.getItem(TOKEN_KEY)
    token.value = stored
    return stored
  }

  /**
   * 清除 Token
   *
   * 移除 localStorage 中存储的 Token，并将 Store 状态置为 null。
   * 通常在退出登录或 Token 过期时调用。
   */
  function clearToken(): void {
    token.value = null
    localStorage.removeItem(TOKEN_KEY)
  }

  return {
    // State
    token,
    // Getters
    hasToken,
    // Actions
    setToken,
    getToken,
    clearToken,
  }
})
