"use client"

import { createContext, useContext, useEffect, useMemo, useState } from "react"
import { fetchMe, type Me } from "@/src/lib/api/me"
import { tokenStorage } from "@/src/lib/api/storage"


type AuthState = {
  me: Me | null
  loading: boolean
  refreshMe: () => Promise<void>
  clearAuth: () => void
}

const AuthContext = createContext<AuthState | null>(null)

export function AuthProvider({ children }: { children: React.ReactNode }) {
  const [me, setMe] = useState<Me | null>(null)
  const [loading, setLoading] = useState(true)

  async function refreshMe() {
    setLoading(true)
    try {
      const data = await fetchMe()
      setMe(data)
      localStorage.setItem("acx_me", JSON.stringify(data)) // cache utile
    } catch {
      setMe(null)
    } finally {
      setLoading(false)
    }
  }

  function clearAuth() {
    tokenStorage.clear()
    localStorage.removeItem("acx_me")
    setMe(null)
  }

  useEffect(() => {
    // si on a un token, on tente de charger /me
    const access = tokenStorage.getAccess()
    if (access) refreshMe()
    else setLoading(false)
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [])

  const value = useMemo(() => ({ me, loading, refreshMe, clearAuth }), [me, loading])

  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
}

export function useAuth() {
  const ctx = useContext(AuthContext)
  if (!ctx) throw new Error("useAuth must be used within AuthProvider")
  return ctx
}
