import { Link } from '@inertiajs/react';
import {
    Briefcase,
    Building2,
    CalendarClock,
    ClipboardList,
    Contact as ContactIcon,
    Gavel,
    LayoutGrid,
    Library,
    ListChecks,
    Scale,
    TimerReset,
    Users as UsersIcon,
} from 'lucide-react';
import AppLogo from '@/components/app-logo';
import { NavMain } from '@/components/nav-main';
import { NavUser } from '@/components/nav-user';
import {
    Sidebar,
    SidebarContent,
    SidebarFooter,
    SidebarHeader,
    SidebarMenu,
    SidebarMenuButton,
    SidebarMenuItem,
} from '@/components/ui/sidebar';
import { usePermissions } from '@/hooks/use-permissions';
import { dashboard } from '@/routes';
import { index as clientsIndex } from '@/routes/clients';
import { index as contactsIndex } from '@/routes/contacts';
import { upcoming as deadlinesUpcoming } from '@/routes/deadlines';
import { index as hearingsIndex } from '@/routes/hearings';
import { index as mattersIndex } from '@/routes/matters';
import { index as officesIndex } from '@/routes/offices';
import { index as referenceIndex } from '@/routes/reference';
import { index as rosterIndex } from '@/routes/roster';
import { index as taskTemplatesIndex } from '@/routes/task-templates';
import { index as tasksIndex } from '@/routes/tasks';
import { index as usersIndex } from '@/routes/users';
import type { NavItem } from '@/types';

export function AppSidebar() {
    const { can } = usePermissions();

    const platformNav: NavItem[] = [
        { title: 'My Day', href: dashboard(), icon: LayoutGrid },
    ];

    const practiceNav: NavItem[] = (
        [
            can('matters.view') && {
                title: 'Matters',
                href: mattersIndex(),
                icon: Scale,
            },
            can('contacts.view') && {
                title: 'Clients',
                href: clientsIndex(),
                icon: Briefcase,
            },
            can('contacts.view') && {
                title: 'Contacts',
                href: contactsIndex(),
                icon: ContactIcon,
            },
            can('hearings.view') && {
                title: 'Hearings',
                href: hearingsIndex(),
                icon: Gavel,
            },
            can('roster.view') && {
                title: 'Roster',
                href: rosterIndex(),
                icon: CalendarClock,
            },
            can('deadlines.view') && {
                title: 'Deadlines',
                href: deadlinesUpcoming(),
                icon: TimerReset,
            },
            can('tasks.view') && {
                title: 'Tasks',
                href: tasksIndex(),
                icon: ListChecks,
            },
        ] as (NavItem | false)[]
    ).filter((item): item is NavItem => Boolean(item));

    const adminNav: NavItem[] = (
        [
            can('offices.manage') && {
                title: 'Offices',
                href: officesIndex(),
                icon: Building2,
            },
            can('reference_data.manage') && {
                title: 'Reference Data',
                href: referenceIndex('courts'),
                icon: Library,
            },
            can('tasks.create') && {
                title: 'Task Checklists',
                href: taskTemplatesIndex(),
                icon: ClipboardList,
            },
            can('users.manage') && {
                title: 'Users',
                href: usersIndex(),
                icon: UsersIcon,
            },
        ] as (NavItem | false)[]
    ).filter((item): item is NavItem => Boolean(item));

    return (
        <Sidebar collapsible="icon" variant="inset">
            <SidebarHeader>
                <SidebarMenu>
                    <SidebarMenuItem>
                        <SidebarMenuButton size="lg" asChild>
                            <Link href={dashboard()} prefetch>
                                <AppLogo />
                            </Link>
                        </SidebarMenuButton>
                    </SidebarMenuItem>
                </SidebarMenu>
            </SidebarHeader>

            <SidebarContent>
                <NavMain label="Platform" items={platformNav} />
                {practiceNav.length > 0 && (
                    <NavMain label="Practice" items={practiceNav} />
                )}
                {adminNav.length > 0 && (
                    <NavMain label="Administration" items={adminNav} />
                )}
            </SidebarContent>

            <SidebarFooter>
                <NavUser />
            </SidebarFooter>
        </Sidebar>
    );
}
