import { useApi } from './useApi'
import type {
  AuthUser,
  LoginPayload,
  SignupPayload,
  SignupResult,
} from '@/types/auth'

// 인증 도메인 API Composable — 인터셉터가 success/data 를 언래핑하므로 data 타입으로 캐스팅
export function useAuth() {
  const api = useApi()

  // 회원가입 — 인증 메일 발송 후 대기(자동 로그인 X). 인증 완료 전까지 로그인 불가.
  async function signup(payload: SignupPayload): Promise<SignupResult> {
    return (await api.post('/auth/signup', payload)) as unknown as SignupResult
  }

  // 인증 메일 재발송
  async function resendVerification(email: string): Promise<void> {
    await api.post('/auth/resend-verification', { email })
  }

  // 비밀번호 재설정 요청 — 재설정 메일 발송(존재 여부 비노출)
  async function forgotPassword(email: string): Promise<void> {
    await api.post('/auth/forgot-password', { email })
  }

  // 비밀번호 재설정 — 메일 링크의 토큰 + 새 비밀번호
  async function resetPassword(token: string, password: string): Promise<void> {
    await api.post('/auth/reset-password', { token, password })
  }

  // 로그인 — silent 옵션 시 전역 에러 토스트를 띄우지 않고 호출측이 직접 처리
  async function login(
    payload: LoginPayload,
    opts?: { silent?: boolean },
  ): Promise<AuthUser> {
    return (await api.post('/auth/login', payload, opts)) as unknown as AuthUser
  }

  // 로그아웃 (쿠키 제거)
  async function logout(): Promise<void> {
    await api.post('/auth/logout')
  }

  // 현재 로그인 사용자 조회 — 부트스트랩/가드용. 미인증이면 throw 되므로 호출측에서 처리
  async function fetchMe(): Promise<AuthUser> {
    // silent: 미인증(401) 시 전역 알림을 띄우지 않는다
    return (await api.get('/auth/me', { silent: true })) as unknown as AuthUser
  }

  return {
    signup,
    resendVerification,
    forgotPassword,
    resetPassword,
    login,
    logout,
    fetchMe,
  }
}
