import { navSections, type NavItem } from '@/Layouts/Admin/nav-config';
import { getRoleColor, getRoleLabel } from '@/Layouts/Admin/role-config';
import { NotificationBell } from '@/components/admin/NotificationBell';
import {
    Breadcrumb,
    BreadcrumbItem,
    BreadcrumbLink,
    BreadcrumbList,
    BreadcrumbPage,
    BreadcrumbSeparator,
} from '@/components/ui/breadcrumb';
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuLabel,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import {
    Tooltip,
    TooltipContent,
    TooltipProvider,
    TooltipTrigger,
} from '@/components/ui/tooltip';
import { useAdminTheme } from '@/hooks/useAdminTheme';
import { cn } from '@/lib/utils';
import type { AdminRole, PageProps } from '@/types';
import { Link, router, usePage } from '@inertiajs/react';
import { AnimatePresence, motion } from 'framer-motion';
import {
    ChevronDown,
    ChevronRight,
    HelpCircle,
    KeyRound,
    LogOut,
    Menu,
    Moon,
    Search,
    Sun,
    UserCircle,
    X,
} from 'lucide-react';
import { PropsWithChildren, useMemo, useState } from 'react';

// ── Sidebar nav item ──────────────────────────────────────────────────────────

function SidebarNavItem({
    item,
    collapsed,
    permissions,
    isSuperAdmin,
}: {
    item: NavItem;
    collapsed: boolean;
    permissions: string[];
    isSuperAdmin: boolean;
}) {
    const { url } = usePage();
    const active = url.startsWith(item.href);

    if (
        !isSuperAdmin &&
        item.permission &&
        !permissions.includes(item.permission)
    ) {
        return null;
    }

    const link = (
        <Link
            href={item.href}
            className={cn(
                'group flex items-center gap-3 rounded-xl px-3 py-2 text-sm transition-all duration-150',
                active
                    ? 'bg-primary/15 text-primary font-semibold'
                    : 'text-foreground dark:text-panel-foreground/50 hover:bg-primary/10 dark:hover:text-panel-foreground dark:hover:bg-primary/10',
                collapsed && 'justify-center px-2',
            )}
        >
            <item.icon
                className={cn(
                    'h-4 w-4 shrink-0',
                    active
                        ? 'text-primary'
                        : 'text-foreground dark:text-panel-foreground/40 dark:group-hover:text-panel-foreground/70',
                )}
            />
            {!collapsed && <span>{item.label}</span>}
            {active && !collapsed && (
                <ChevronRight className="text-primary/60 ml-auto h-3 w-3" />
            )}
        </Link>
    );

    if (!collapsed) return link;

    return (
        <Tooltip>
            <TooltipTrigger asChild>{link}</TooltipTrigger>
            <TooltipContent side="right" className="font-medium">
                {item.label}
            </TooltipContent>
        </Tooltip>
    );
}

// ── Layout ────────────────────────────────────────────────────────────────────

export interface BreadcrumbEntry {
    label: string;
    href?: string;
}

interface Props extends PropsWithChildren {
    title?: string;
    breadcrumbs?: BreadcrumbEntry[];
}

export default function AdminLayout({
    children,
    title,
    breadcrumbs: breadcrumbsProp,
}: Props) {
    const { auth } = usePage<PageProps>().props;
    const { url } = usePage();
    const permissions = auth.adminPermissions ?? [];
    const role = auth.adminRole as AdminRole | null;
    const isSuperAdmin = role === 'super_admin';

    // Auto-derive breadcrumbs from nav config unless overridden
    const breadcrumbs = useMemo<BreadcrumbEntry[]>(() => {
        if (breadcrumbsProp) return breadcrumbsProp;
        for (const section of navSections) {
            for (const item of section.items) {
                if (url.startsWith(item.href)) {
                    return [
                        { label: section.label },
                        { label: item.label, href: item.href },
                    ];
                }
            }
        }
        return title ? [{ label: title }] : [];
    }, [breadcrumbsProp, url, title]);

    const { isDark, toggleTheme } = useAdminTheme();
    const [sidebarOpen, setSidebarOpen] = useState(false);
    const [collapsed, setCollapsed] = useState(false);
    const [search, setSearch] = useState('');

    const handleLogout = () => router.post(route('admin.logout'));

    const filteredSections = useMemo(() => {
        const q = search.toLowerCase().trim();
        if (!q) return navSections;
        return navSections
            .map((s) => ({
                ...s,
                items: s.items.filter((i) => i.label.toLowerCase().includes(q)),
            }))
            .filter((s) => s.items.length > 0);
    }, [search]);

    const Sidebar = ({ mobile = false }: { mobile?: boolean }) => {
        const isCollapsed = collapsed && !mobile;

        return (
            <aside
                className={cn(
                    'border-border flex h-full flex-col border-r dark:border-white/5',
                    'bg-white shadow-[1px_0_0_0_hsl(var(--border))] dark:bg-[hsl(218_22%_6%)]/95 dark:shadow-none dark:backdrop-blur-xl',
                    mobile ? 'w-72' : isCollapsed ? 'w-16' : 'w-64',
                    'transition-all duration-300',
                )}
            >
                {/* Logo */}
                <div
                    className={cn(
                        'border-border flex h-16 shrink-0 items-center border-b px-4 dark:border-white/5',
                        isCollapsed ? 'justify-center px-2' : 'gap-3',
                    )}
                >
                    <img
                        src="/images/logo.png"
                        alt="Upepo Finance"
                        className="h-8 w-8 shrink-0 object-contain"
                    />
                    {!isCollapsed && (
                        <div>
                            <p className="text-foreground dark:text-panel-foreground text-sm font-bold tracking-tight">
                                Upepo Finance
                            </p>
                            <p className="text-primary/70 text-[10px] font-semibold tracking-widest uppercase">
                                Admin Console
                            </p>
                        </div>
                    )}
                    {!mobile && (
                        <Tooltip>
                            <TooltipTrigger asChild>
                                <button
                                    onClick={() => setCollapsed((v) => !v)}
                                    className="text-foreground dark:text-panel-foreground/30 dark:hover:text-panel-foreground/60 ml-auto transition-colors"
                                    aria-label="Toggle sidebar"
                                >
                                    <ChevronRight
                                        className={cn(
                                            'h-4 w-4 transition-transform duration-300',
                                            !isCollapsed && 'rotate-180',
                                        )}
                                    />
                                </button>
                            </TooltipTrigger>
                            <TooltipContent side="right">
                                {isCollapsed
                                    ? 'Expand sidebar'
                                    : 'Collapse sidebar'}
                            </TooltipContent>
                        </Tooltip>
                    )}
                </div>

                {/* Search — only when expanded */}
                {!isCollapsed && (
                    <div className="shrink-0 px-3 pt-3">
                        <div className="relative">
                            <Search className="text-foreground dark:text-panel-foreground/30 absolute top-1/2 left-2.5 h-3.5 w-3.5 -translate-y-1/2" />
                            <input
                                type="text"
                                placeholder="Search..."
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                                className={cn(
                                    'bg-muted w-full rounded-lg py-1.5 pr-3 pl-8 text-xs dark:bg-white/5',
                                    'text-foreground dark:text-panel-foreground placeholder:text-muted-foreground dark:placeholder:text-panel-foreground/25',
                                    'border-border border outline-none dark:border-white/5',
                                    'focus:border-primary/50 dark:focus:border-primary/30 focus:ring-primary/20 transition-colors focus:ring-1',
                                )}
                            />
                        </div>
                    </div>
                )}

                {/* Scrollable nav */}
                <nav className="admin-scrollbar flex-1 space-y-6 overflow-y-auto px-3 py-4">
                    {filteredSections.map((section) => {
                        const visibleItems = section.items.filter(
                            (item) =>
                                isSuperAdmin ||
                                !item.permission ||
                                permissions.includes(item.permission),
                        );
                        if (visibleItems.length === 0) return null;

                        return (
                            <div key={section.label}>
                                {!isCollapsed && (
                                    <p className="text-foreground dark:text-panel-foreground/25 mb-1.5 px-3 text-[9px] font-bold tracking-[0.12em] uppercase">
                                        {section.label}
                                    </p>
                                )}
                                <div className="space-y-0.5">
                                    {section.items.map((item) => (
                                        <SidebarNavItem
                                            key={item.href}
                                            item={item}
                                            collapsed={isCollapsed}
                                            permissions={permissions}
                                            isSuperAdmin={isSuperAdmin}
                                        />
                                    ))}
                                </div>
                            </div>
                        );
                    })}
                    {search && filteredSections.length === 0 && (
                        <p className="text-foreground dark:text-panel-foreground/30 px-3 text-xs">
                            No results for "{search}"
                        </p>
                    )}
                </nav>

                {/* Account footer */}
                <div className="border-border shrink-0 border-t p-3 dark:border-white/5">
                    <DropdownMenu>
                        {isCollapsed ? (
                            <Tooltip>
                                <TooltipTrigger asChild>
                                    <DropdownMenuTrigger asChild>
                                        <button className="text-foreground dark:text-panel-foreground/50 hover:bg-primary/10 dark:hover:text-panel-foreground dark:hover:bg-primary/10 flex w-full items-center justify-center rounded-xl py-2 transition-colors">
                                            <div className="bg-primary/20 text-primary flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold">
                                                {auth.admin?.name?.[0] ?? 'A'}
                                            </div>
                                        </button>
                                    </DropdownMenuTrigger>
                                </TooltipTrigger>
                                <TooltipContent side="right">
                                    {auth.admin?.name ?? 'Account'}
                                </TooltipContent>
                            </Tooltip>
                        ) : (
                            <DropdownMenuTrigger asChild>
                                <button className="group hover:bg-primary/10 dark:hover:bg-primary/10 flex w-full items-center gap-3 rounded-xl px-3 py-2 transition-colors">
                                    <div className="bg-primary/20 text-primary flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-bold">
                                        {auth.admin?.name?.[0] ?? 'A'}
                                    </div>
                                    <div className="min-w-0 flex-1 text-left">
                                        <p className="text-foreground dark:text-panel-foreground truncate text-sm font-semibold">
                                            {auth.admin?.name ?? 'Admin'}
                                        </p>
                                        {role && (
                                            <span
                                                className={cn(
                                                    'inline-block rounded-full px-1.5 py-0.5 text-[9px] font-bold tracking-wide',
                                                    getRoleColor(role) ??
                                                        'text-panel-foreground/50 bg-white/10',
                                                )}
                                            >
                                                {getRoleLabel(role)}
                                            </span>
                                        )}
                                    </div>
                                    <ChevronDown className="text-foreground dark:text-panel-foreground/30 h-3.5 w-3.5 shrink-0 transition-transform group-data-[state=open]:rotate-180" />
                                </button>
                            </DropdownMenuTrigger>
                        )}

                        <DropdownMenuContent
                            side="top"
                            align="start"
                            sideOffset={8}
                            className="bg-popover border-border text-foreground dark:text-panel-foreground w-56 dark:border-white/8 dark:bg-[hsl(218_20%_9%)]"
                        >
                            <DropdownMenuLabel className="text-foreground dark:text-panel-foreground/50 text-xs font-normal">
                                {auth.admin?.email ?? ''}
                            </DropdownMenuLabel>
                            <DropdownMenuSeparator className="bg-border dark:bg-white/5" />
                            <DropdownMenuItem asChild>
                                <Link
                                    href="/admin/profile"
                                    className="focus:bg-muted focus:text-foreground dark:focus:text-panel-foreground flex cursor-pointer items-center gap-2 dark:focus:bg-white/5"
                                >
                                    <UserCircle className="text-foreground dark:text-panel-foreground/40 h-4 w-4" />
                                    Profile
                                </Link>
                            </DropdownMenuItem>
                            <DropdownMenuItem asChild>
                                <Link
                                    href="/admin/settings/security"
                                    className="focus:bg-muted focus:text-foreground dark:focus:text-panel-foreground flex cursor-pointer items-center gap-2 dark:focus:bg-white/5"
                                >
                                    <KeyRound className="text-foreground dark:text-panel-foreground/40 h-4 w-4" />
                                    Change password
                                </Link>
                            </DropdownMenuItem>
                            <DropdownMenuItem asChild>
                                <Link
                                    href="/admin/support"
                                    className="focus:bg-muted focus:text-foreground dark:focus:text-panel-foreground flex cursor-pointer items-center gap-2 dark:focus:bg-white/5"
                                >
                                    <HelpCircle className="text-foreground dark:text-panel-foreground/40 h-4 w-4" />
                                    Help &amp; support
                                </Link>
                            </DropdownMenuItem>
                            <DropdownMenuSeparator className="bg-border dark:bg-white/5" />
                            <DropdownMenuItem
                                onClick={handleLogout}
                                className="text-destructive focus:bg-destructive/10 focus:text-destructive flex cursor-pointer items-center gap-2"
                            >
                                <LogOut className="h-4 w-4" />
                                Sign out
                            </DropdownMenuItem>
                        </DropdownMenuContent>
                    </DropdownMenu>
                </div>
            </aside>
        );
    };

    return (
        <TooltipProvider delayDuration={200}>
            <div className="pf-page-bg text-foreground flex min-h-screen">
                {/* Fixed desktop sidebar */}
                <div
                    className={cn(
                        'sticky top-0 z-20 hidden h-screen lg:flex lg:shrink-0',
                        collapsed ? 'w-16' : 'w-64',
                        'transition-all duration-300',
                    )}
                >
                    <Sidebar />
                </div>

                {/* Mobile sidebar overlay */}
                <AnimatePresence>
                    {sidebarOpen && (
                        <>
                            <motion.div
                                initial={{ opacity: 0 }}
                                animate={{ opacity: 1 }}
                                exit={{ opacity: 0 }}
                                className="fixed inset-0 z-40 bg-black/60 backdrop-blur-sm lg:hidden"
                                onClick={() => setSidebarOpen(false)}
                            />
                            <motion.div
                                initial={{ x: '-100%' }}
                                animate={{ x: 0 }}
                                exit={{ x: '-100%' }}
                                transition={{
                                    type: 'spring',
                                    damping: 30,
                                    stiffness: 300,
                                }}
                                className="fixed inset-y-0 left-0 z-50 h-full lg:hidden"
                            >
                                <Sidebar mobile />
                                <button
                                    onClick={() => setSidebarOpen(false)}
                                    className="text-panel-foreground/50 hover:text-panel-foreground absolute top-4 right-3"
                                >
                                    <X className="h-5 w-5" />
                                </button>
                            </motion.div>
                        </>
                    )}
                </AnimatePresence>

                {/* Main content */}
                <div className="flex min-w-0 flex-1 flex-col">
                    <header className="border-border bg-card/95 sticky top-0 z-10 flex h-16 shrink-0 items-center gap-4 border-b px-6 shadow-sm backdrop-blur-xl">
                        <button
                            onClick={() => setSidebarOpen(true)}
                            className="text-foreground dark:text-muted-foreground dark:hover:text-foreground transition-colors lg:hidden"
                        >
                            <Menu className="h-5 w-5" />
                        </button>
                        <div className="flex min-w-0 flex-1 items-center">
                            {breadcrumbs.length > 0 && (
                                <Breadcrumb>
                                    <BreadcrumbList>
                                        {breadcrumbs.map((crumb, i) => {
                                            const isLast =
                                                i === breadcrumbs.length - 1;
                                            return (
                                                <span
                                                    key={i}
                                                    className="flex items-center gap-1.5"
                                                >
                                                    {i > 0 && (
                                                        <BreadcrumbSeparator />
                                                    )}
                                                    <BreadcrumbItem>
                                                        {isLast ? (
                                                            <BreadcrumbPage className="text-foreground text-sm font-semibold">
                                                                {crumb.label}
                                                            </BreadcrumbPage>
                                                        ) : (
                                                            <BreadcrumbLink
                                                                asChild
                                                            >
                                                                {crumb.href ? (
                                                                    <Link
                                                                        href={
                                                                            crumb.href
                                                                        }
                                                                        className="text-foreground dark:text-muted-foreground dark:hover:text-foreground text-sm transition-colors"
                                                                    >
                                                                        {
                                                                            crumb.label
                                                                        }
                                                                    </Link>
                                                                ) : (
                                                                    <span className="text-foreground dark:text-muted-foreground text-sm">
                                                                        {
                                                                            crumb.label
                                                                        }
                                                                    </span>
                                                                )}
                                                            </BreadcrumbLink>
                                                        )}
                                                    </BreadcrumbItem>
                                                </span>
                                            );
                                        })}
                                    </BreadcrumbList>
                                </Breadcrumb>
                            )}
                        </div>
                        <div className="flex items-center gap-2">
                            <Tooltip>
                                <TooltipTrigger asChild>
                                    <button
                                        onClick={toggleTheme}
                                        className="text-foreground dark:text-muted-foreground hover:bg-primary/10 hover:text-primary flex h-9 w-9 items-center justify-center rounded-xl transition-colors"
                                        aria-label="Toggle theme"
                                    >
                                        {isDark ? (
                                            <Sun className="h-4 w-4" />
                                        ) : (
                                            <Moon className="h-4 w-4" />
                                        )}
                                    </button>
                                </TooltipTrigger>
                                <TooltipContent>
                                    {isDark
                                        ? 'Switch to light mode'
                                        : 'Switch to dark mode'}
                                </TooltipContent>
                            </Tooltip>

                            <NotificationBell />
                            <div className="bg-border h-5 w-px" />
                            <div className="flex items-center gap-2.5 rounded-xl px-2 py-1">
                                <div className="bg-primary/20 text-primary flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold">
                                    {auth.admin?.name?.[0] ?? 'A'}
                                </div>
                                <div className="hidden flex-col sm:flex">
                                    <span className="text-foreground/80 text-sm leading-tight font-medium">
                                        {auth.admin?.name ?? 'Admin'}
                                    </span>
                                    {role && (
                                        <span
                                            className={cn(
                                                'self-start rounded-full px-1.5 py-0.5 text-[9px] font-bold tracking-wide',
                                                getRoleColor(role) ??
                                                    'text-foreground dark:text-muted-foreground',
                                            )}
                                        >
                                            {getRoleLabel(role)}
                                        </span>
                                    )}
                                </div>
                            </div>
                        </div>
                    </header>
                    <main className="flex-1">{children}</main>
                </div>
            </div>
        </TooltipProvider>
    );
}
