import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import type { UserInfo } from '@/types'

const TOKEN_KEY = 'snack-web-token'
const USER_KEY = 'snack-web-user'

/**
 * 用户登录态 Store
 *
 * 持久化：直接走 localStorage（web-snack 暂未引入 pinia-plugin-persistedstate）
 * - token 存于 snack-web-token
 * - userInfo 存于 snack-web-user（登录响应里只有 userId/nickname，其他字段后续按需扩展）
 *
 * request 拦截器会从这里取 token；401 触发 clearAuth + 跳 /login
 */
export const useUserStore = defineStore('user', () => {
  const token = ref(localStorage.getItem(TOKEN_KEY) || '')
  const user = ref<UserInfo | null>(loadUser())

  const isLoggedIn = computed(() => !!token.value)
  const userId = computed(() => user.value?.id ?? 0)
  const nickname = computed(() => user.value?.nickname ?? '')
  const avatar = computed(() => user.value?.avatar ?? '')

  /** 登录成功后写入 token 与基础用户信息 */
  function setAuth(t: string, info: UserInfo) {
    token.value = t
    user.value = info
    localStorage.setItem(TOKEN_KEY, t)
    localStorage.setItem(USER_KEY, JSON.stringify(info))
  }

  /** 仅写 token（兼容老代码：setAuth 是新接口） */
  function setToken(t: string) {
    token.value = t
    localStorage.setItem(TOKEN_KEY, t)
  }

  /** 更新用户信息（不重置 token） */
  function setUser(info: UserInfo) {
    user.value = info
    localStorage.setItem(USER_KEY, JSON.stringify(info))
  }

  /** 清空登录态（request 拦截器在 401 时调用） */
  function clearAuth() {
    token.value = ''
    user.value = null
    localStorage.removeItem(TOKEN_KEY)
    localStorage.removeItem(USER_KEY)
  }

  return {
    token,
    user,
    isLoggedIn,
    userId,
    nickname,
    avatar,
    setAuth,
    setToken,
    setUser,
    clearAuth
  }
})

function loadUser(): UserInfo | null {
  try {
    const raw = localStorage.getItem(USER_KEY)
    return raw ? (JSON.parse(raw) as UserInfo) : null
  } catch {
    return null
  }
}
