'use client'

import { useEffect, type ReactNode } from 'react'
import { useRouter } from './RouterContext'
import { useAuth, useAuthRoutes } from './AuthContext'

/**
 * Route guard that only renders children if the user is authenticated.
 * Redirects to login page if not authenticated.
 */
export function UserRoute({ children }: { children: ReactNode }) {
    const router = useRouter()
    const routes = useAuthRoutes()
    const { isAuthenticated } = useAuth()

    useEffect(() => {
        if (!isAuthenticated) {
            const searchParams = router.searchParams.toString()
            const currentPath = searchParams
                ? `${router.pathname}?${searchParams}`
                : router.pathname
            const next = encodeURIComponent(currentPath)
            router.replace(`${routes.login}?next=${next}`)
        }
    }, [isAuthenticated, router, routes.login])

    if (!isAuthenticated) return null
    return children
}

/**
 * Route guard that only renders children if the user is authenticated AND is staff.
 * Redirects to login if not authenticated, or to authenticated route if not staff.
 */
export function StaffRoute({ children }: { children: ReactNode }) {
    const router = useRouter()
    const routes = useAuthRoutes()
    const { isAuthenticated, isStaff } = useAuth()

    useEffect(() => {
        if (!isAuthenticated) {
            const searchParams = router.searchParams.toString()
            const currentPath = searchParams
                ? `${router.pathname}?${searchParams}`
                : router.pathname
            const next = encodeURIComponent(currentPath)
            router.replace(`${routes.login}?next=${next}`)
        } else if (!isStaff) {
            router.replace(routes.authenticated)
        }
    }, [isAuthenticated, isStaff, router, routes])

    if (!isAuthenticated || !isStaff) return null
    return children
}

/**
 * Route guard that only renders children if the user is NOT authenticated.
 * Redirects to authenticated route if already logged in.
 */
export function AnonymousRoute({ children }: { children: ReactNode }) {
    const router = useRouter()
    const routes = useAuthRoutes()
    const { isAuthenticated } = useAuth()

    useEffect(() => {
        if (isAuthenticated) {
            router.replace(routes.authenticated)
        }
    }, [isAuthenticated, routes.authenticated, router])

    if (isAuthenticated) return null
    return children
}
