'use client';

import React from 'react';
import { Result, Button, Spin } from 'antd';
import { useRouter } from 'next/navigation';
import { usePermissions } from '@/contexts/PermissionsContext';

interface ProtectedRouteProps {
    children: React.ReactNode;
    requiredPermission?: string;
    requiredRole?: string;
    requiredRoles?: string[];
    requiredPermissions?: string[];
    requiredModule?: string;
    requiredAction?: string;
    fallback?: React.ReactNode;
}

export function ProtectedRoute({
    children,
    requiredPermission,
    requiredRole,
    requiredRoles,
    requiredPermissions,
    requiredModule,
    requiredAction,
    fallback,
}: ProtectedRouteProps) {
    const {
        hasPermission,
        hasRole,
        hasAnyRole,
        hasAnyPermission,
        canAccess,
        loading,
    } = usePermissions();
    const router = useRouter();

    // Não decidir 403 enquanto permissões ainda carregam (evita flash falso).
    if (loading) {
        return (
            <div
                style={{ padding: 48, textAlign: 'center' }}
                aria-busy="true"
                aria-live="polite"
                data-testid="protected-route-loading"
            >
                <Spin size="large" />
            </div>
        );
    }

    let hasAccess = true;

    // Verificar permissão específica
    if (requiredPermission) {
        hasAccess = hasAccess && hasPermission(requiredPermission);
    }

    // Verificar role específico
    if (requiredRole) {
        hasAccess = hasAccess && hasRole(requiredRole);
    }

    // Verificar múltiplos roles (qualquer um)
    if (requiredRoles && requiredRoles.length > 0) {
        hasAccess = hasAccess && hasAnyRole(requiredRoles);
    }

    // Verificar múltiplas permissões (qualquer uma)
    if (requiredPermissions && requiredPermissions.length > 0) {
        hasAccess = hasAccess && hasAnyPermission(requiredPermissions);
    }

    // Verificar acesso por módulo e ação
    if (requiredModule && requiredAction) {
        hasAccess = hasAccess && canAccess(requiredModule, requiredAction);
    }

    if (!hasAccess) {
        if (fallback) {
            return <>{fallback}</>;
        }

        return (
            <Result
                status="403"
                title="403"
                subTitle="Você não tem permissão para acessar esta página."
                extra={
                    <Button type="primary" onClick={() => router.push('/dashboard')}>
                        Voltar ao Dashboard
                    </Button>
                }
            />
        );
    }

    return <>{children}</>;
}
