import { render, screen } from '@testing-library/react';
import type { ComponentProps } from 'react';
import { describe, expect, it, vi } from 'vitest';
import Dashboard from '@/pages/dashboard';

vi.mock('@inertiajs/react', () => ({
    Head: () => null,
    Link: ({ children, href, className }: ComponentProps<'a'>) => (
        <a href={href} className={className}>
            {children}
        </a>
    ),
}));

vi.mock('@/routes/fichas-inventario', () => ({
    index: () => ({ url: '/fichas-inventario' }),
}));

vi.mock('@/routes/fichas-registro', () => ({
    index: () => ({ url: '/fichas-registro' }),
}));

vi.mock('@/routes/invitations', () => ({
    index: () => ({ url: '/invitations' }),
}));

vi.mock('@/routes/users', () => ({
    index: () => ({ url: '/users' }),
}));

describe('Dashboard', () => {
    it('renders the main module cards', () => {
        render(
            <Dashboard
                auth={{
                    user: {
                        role: 'administrador',
                        permissions: [
                            'users.view',
                            'users.create',
                            'fichas.registro.manage',
                            'fichas.inventario.manage',
                        ],
                    },
                }}
                stats={{
                    fichas_registro: { mis_fichas: 2, fichas_observadas: 1 },
                    fichas_inventario: { mis_fichas: 3, fichas_observadas: 0 },
                    fichas_catalogacion: {
                        mis_fichas: 0,
                        fichas_observadas: 0,
                    },
                    pending_invitations: 4,
                }}
            />,
        );

        const registroCard = screen
            .getByRole('heading', { name: 'Fichas de Registro' })
            .closest('a');
        const inventarioCard = screen
            .getByRole('heading', { name: 'Fichas de Inventario' })
            .closest('a');

        expect(registroCard).toHaveClass('p-5');
        expect(inventarioCard).toHaveClass('p-5');
    });

    it('renders disabled modules when permissions are missing', () => {
        render(
            <Dashboard
                auth={{
                    user: {
                        role: 'especialista',
                        permissions: [],
                    },
                }}
                stats={{
                    fichas_registro: { mis_fichas: 0, fichas_observadas: 0 },
                    fichas_inventario: { mis_fichas: 0, fichas_observadas: 0 },
                    fichas_catalogacion: {
                        mis_fichas: 0,
                        fichas_observadas: 0,
                    },
                    pending_invitations: 0,
                }}
            />,
        );

        expect(
            screen.getAllByText(/no tienes permiso para gestionar este modulo/i)
                .length,
        ).toBeGreaterThan(0);
        expect(
            screen.getByText(/necesitas permiso para crear usuarios/i),
        ).toBeInTheDocument();
    });
});
