"use client"

import {
  createContext,
  useCallback,
  useContext,
  useMemo,
  type ReactNode,
} from "react"

import { hasPermission } from "@/lib/auth/permissions"
import type { SessionUser } from "@/lib/auth/session-user"
import type { PermissionType } from "@/lib/acl-routes"

type AuthContextValue = {
  user: SessionUser
  permissionType: PermissionType
  permissions: string[]
  hasPermission: (key: string) => boolean
}

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

export function AuthProvider({
  user,
  children,
}: {
  user: SessionUser
  children: ReactNode
}) {
  const check = useCallback(
    (key: string) => hasPermission(user.permissionType, user.permissions, key),
    [user.permissionType, user.permissions]
  )

  const value = useMemo<AuthContextValue>(
    () => ({
      user,
      permissionType: user.permissionType,
      permissions: user.permissions,
      hasPermission: check,
    }),
    [user, check]
  )

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

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