import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import { useAuth } from '@/composables/useAuth'
import type {
  AuthUser,
  LoginPayload,
  SignupPayload,
  SignupResult,
} from '@/types/auth'

// 인증 상태 스토어 — 현재 사용자/로그인 여부 + 인증 액션
export const useAuthStore = defineStore('auth', () => {
  const user = ref<AuthUser | null>(null)
  // 앱 시작 시 1회 부트스트랩(/auth/me) 완료 여부 — 가드에서 중복 호출 방지
  const bootstrapped = ref<boolean>(false)

  const isLoggedIn = computed<boolean>(() => user.value !== null)

  const {
    signup: signupApi,
    resendVerification: resendApi,
    login: loginApi,
    logout: logoutApi,
    fetchMe,
  } = useAuth()

  // 로그인 — silent 옵션은 그대로 전달(에러 토스트 억제, 호출측 직접 처리)
  async function login(
    payload: LoginPayload,
    opts?: { silent?: boolean },
  ): Promise<void> {
    user.value = await loginApi(payload, opts)
  }

  // 회원가입 — 인증 메일 발송 후 대기. 자동 로그인하지 않으므로 user 는 갱신하지 않는다.
  async function signup(payload: SignupPayload): Promise<SignupResult> {
    return signupApi(payload)
  }

  // 인증 메일 재발송
  async function resendVerification(email: string): Promise<void> {
    await resendApi(email)
  }

  // 로그아웃
  async function logout(): Promise<void> {
    try {
      await logoutApi()
    } finally {
      user.value = null
    }
  }

  // 앱 시작 시 세션 복원 — 쿠키 기반으로 현재 사용자 조회. 실패 시 비로그인 상태
  async function bootstrap(): Promise<void> {
    if (bootstrapped.value) return
    try {
      user.value = await fetchMe()
    } catch {
      user.value = null
    } finally {
      bootstrapped.value = true
    }
  }

  return {
    user,
    isLoggedIn,
    bootstrapped,
    login,
    signup,
    resendVerification,
    logout,
    bootstrap,
  }
})
