'use client';

import { useState } from 'react';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import {
  LayoutDashboard,
  Users,
  Bookmark,
  Anchor,
  Ship,
  Building2,
  Receipt,
  FileText,
  FolderOpen,
  Mail,
  Bell,
  Camera,
  ShieldAlert,
  Settings,
  Shield,
  Home,
  ChevronLeft,
  ChevronRight,
  Menu,
  ChevronDown,
  ChevronUp,
} from 'lucide-react';

import { cn } from '@/lib/utils';
import { useUIStore } from '@/stores/ui-store';
import { Button } from '@/components/ui/button';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
import type { UserPortRole } from '@/lib/db/schema/users';
import type { Role } from '@/lib/db/schema/users';

interface SidebarProps {
  portRoles: (UserPortRole & { port: { id: string; slug: string; name: string }; role: Role })[];
  isSuperAdmin?: boolean;
  user?: { name: string; email: string };
}

interface NavItem {
  href: string;
  label: string;
  icon: React.ElementType;
  exact?: boolean;
}

interface NavSection {
  title: string;
  items: NavItem[];
  adminRequired?: boolean;
  /** When true, only render if the user has marina-side access. */
  marinaRequired?: boolean;
  /** When true, only render if the user has residential-side access. */
  residentialRequired?: boolean;
}

function buildNavSections(portSlug: string | undefined): NavSection[] {
  const base = portSlug ? `/${portSlug}` : '';

  return [
    {
      title: 'Main',
      marinaRequired: true,
      items: [
        { href: `${base}/dashboard`, label: 'Dashboard', icon: LayoutDashboard },
        { href: `${base}/alerts`, label: 'Alerts', icon: ShieldAlert },
        { href: `${base}/clients`, label: 'Clients', icon: Users },
        { href: `${base}/yachts`, label: 'Yachts', icon: Ship },
        { href: `${base}/companies`, label: 'Companies', icon: Building2 },
        { href: `${base}/interests`, label: 'Interests', icon: Bookmark },
        { href: `${base}/berths`, label: 'Berths', icon: Anchor },
      ],
    },
    {
      title: 'Residential',
      residentialRequired: true,
      items: [
        {
          href: `${base}/residential/clients`,
          label: 'Residential Clients',
          icon: Home,
        },
        {
          href: `${base}/residential/interests`,
          label: 'Residential Interests',
          icon: Bookmark,
        },
      ],
    },
    {
      title: 'Documents',
      marinaRequired: true,
      items: [
        { href: `${base}/documents`, label: 'Documents', icon: FileText },
        { href: `${base}/documents/files`, label: 'Files', icon: FolderOpen },
      ],
    },
    {
      title: 'Financial',
      marinaRequired: true,
      items: [
        { href: `${base}/expenses`, label: 'Expenses', icon: Receipt },
        { href: `${base}/scan`, label: 'Scan receipt', icon: Camera },
        { href: `${base}/invoices`, label: 'Invoices', icon: FileText },
      ],
    },
    {
      title: 'Communication',
      marinaRequired: true,
      items: [
        { href: `${base}/email`, label: 'Email', icon: Mail },
        { href: `${base}/reminders`, label: 'Reminders', icon: Bell },
      ],
    },
    {
      title: 'Admin',
      adminRequired: true,
      items: [
        { href: `${base}/settings`, label: 'Settings', icon: Settings },
        { href: `${base}/admin`, label: 'Administration', icon: Shield },
      ],
    },
  ];
}

function NavItemLink({
  item,
  collapsed,
  active,
}: {
  item: NavItem;
  collapsed: boolean;
  active: boolean;
}) {
  const content = (
    <Link
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      href={item.href as any}
      className={cn(
        'relative flex items-center gap-3 px-3 py-2 rounded-md text-sm font-medium transition-all duration-150',
        'text-[#cdcfd6] hover:bg-[#171f35] hover:text-white',
        active && 'text-white pl-[14px]',
        collapsed && 'justify-center px-2',
      )}
    >
      {active && !collapsed && (
        <span
          aria-hidden
          className="absolute left-0 top-1 bottom-1 w-1 rounded-r-full bg-[#3a7bc8]"
        />
      )}
      <item.icon
        className={cn(
          'shrink-0',
          active ? 'text-[#3a7bc8]' : 'text-[#83aab1]',
          collapsed ? 'w-5 h-5' : 'w-4 h-4',
        )}
      />
      {!collapsed && <span>{item.label}</span>}
    </Link>
  );

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

  return content;
}

function SidebarContent({
  collapsed,
  portSlug,
  portRoles,
  hasAdminAccess,
  hasMarinaAccess,
  hasResidentialAccess,
  user,
  onToggleCollapse,
}: {
  collapsed: boolean;
  portSlug: string | undefined;
  portRoles: SidebarProps['portRoles'];
  hasAdminAccess: boolean;
  hasMarinaAccess: boolean;
  hasResidentialAccess: boolean;
  user?: SidebarProps['user'];
  /** When provided, renders the collapse toggle row above the user footer (desktop). */
  onToggleCollapse?: () => void;
}) {
  const pathname = usePathname();
  const [adminExpanded, setAdminExpanded] = useState(true);
  const sections = buildNavSections(portSlug);

  function isActive(href: string, exact?: boolean): boolean {
    if (exact) return pathname === href;
    return pathname.startsWith(href);
  }

  return (
    <TooltipProvider delayDuration={0}>
      <div className="flex flex-col h-full bg-[#1e2844]">
        {/* Logo area */}
        <div
          className={cn(
            'flex items-center gap-3 px-4 py-5 border-b border-[#474e66]',
            collapsed && 'justify-center px-2',
          )}
        >
          <div className="shrink-0 w-8 h-8 rounded-md bg-[#3a7bc8] flex items-center justify-center">
            <span className="text-white font-bold text-sm">PN</span>
          </div>
          {!collapsed && (
            <div className="min-w-0">
              <p className="text-white font-semibold text-sm leading-tight truncate">Port Nimara</p>
              <p className="text-[#83aab1] text-xs truncate">Marina CRM</p>
            </div>
          )}
        </div>

        {/* Nav */}
        <ScrollArea className="flex-1 py-2">
          <nav className="px-2 space-y-4">
            {sections.map((section) => {
              if (section.adminRequired && !hasAdminAccess) return null;
              if (section.marinaRequired && !hasMarinaAccess) return null;
              if (section.residentialRequired && !hasResidentialAccess) return null;

              return (
                <div key={section.title}>
                  {!collapsed && (
                    <div className="flex items-center justify-between px-1 mb-1">
                      <span className="text-[#83aab1] text-[10px] font-semibold uppercase tracking-[0.12em]">
                        {section.title}
                      </span>
                      {section.adminRequired && (
                        <button
                          onClick={() => setAdminExpanded((v) => !v)}
                          className="text-[#71768a] hover:text-[#cdcfd6] transition-colors"
                        >
                          {adminExpanded ? (
                            <ChevronUp className="w-3 h-3" />
                          ) : (
                            <ChevronDown className="w-3 h-3" />
                          )}
                        </button>
                      )}
                    </div>
                  )}
                  {(!section.adminRequired || adminExpanded || collapsed) && (
                    <ul className="space-y-0.5">
                      {section.items.map((item) => (
                        <li key={item.href}>
                          <NavItemLink
                            item={item}
                            collapsed={collapsed}
                            active={isActive(item.href, item.exact)}
                          />
                        </li>
                      ))}
                    </ul>
                  )}
                  <Separator className="mt-3 bg-[#474e66]/50" />
                </div>
              );
            })}
          </nav>
        </ScrollArea>

        {/* Collapse toggle (desktop only) */}
        {onToggleCollapse && (
          <button
            type="button"
            onClick={onToggleCollapse}
            aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
            className={cn(
              'flex items-center w-full border-t border-[#474e66] px-3 py-2',
              'text-[#83aab1] hover:bg-[#171f35] hover:text-white transition-colors',
              collapsed ? 'justify-center' : 'justify-end gap-2',
            )}
          >
            {!collapsed && (
              <span className="text-[10px] font-medium uppercase tracking-[0.12em]">Collapse</span>
            )}
            {collapsed ? <ChevronRight className="w-4 h-4" /> : <ChevronLeft className="w-4 h-4" />}
          </button>
        )}

        {/* User footer */}
        <div className={cn('border-t border-[#474e66] p-3', collapsed && 'flex justify-center')}>
          {collapsed ? (
            <Tooltip>
              <TooltipTrigger asChild>
                <Avatar className="w-8 h-8 cursor-pointer">
                  <AvatarImage src={undefined} />
                  <AvatarFallback className="bg-[#3a7bc8] text-white text-xs font-semibold">
                    U
                  </AvatarFallback>
                </Avatar>
              </TooltipTrigger>
              <TooltipContent side="right">User Profile</TooltipContent>
            </Tooltip>
          ) : (
            <div className="flex items-center gap-3">
              <Avatar className="w-8 h-8 shrink-0 shadow-sm ring-2 ring-white/30">
                <AvatarImage src={undefined} />
                <AvatarFallback className="bg-[#3a7bc8] text-white text-xs font-semibold">
                  {(user?.name ?? 'U').slice(0, 1).toUpperCase()}
                </AvatarFallback>
              </Avatar>
              <div className="flex-1 min-w-0">
                <p className="text-white text-sm font-medium truncate">{user?.name ?? 'User'}</p>
                <Badge
                  variant="outline"
                  className="text-[10px] px-1.5 py-0 text-[#83aab1] border-[#474e66] mt-0.5"
                >
                  {portRoles[0]?.role?.name ?? 'Staff'}
                </Badge>
              </div>
            </div>
          )}
        </div>
      </div>
    </TooltipProvider>
  );
}

export function Sidebar({ portRoles, isSuperAdmin = false, user }: SidebarProps) {
  const sidebarCollapsed = useUIStore((s) => s.sidebarCollapsed);
  const toggleSidebar = useUIStore((s) => s.toggleSidebar);
  const currentPortSlug = useUIStore((s) => s.currentPortSlug);

  // Super admins see every section regardless of role rows.
  const hasAdminAccess =
    isSuperAdmin ||
    portRoles.some(
      (pr) =>
        pr.role?.permissions?.admin?.manage_users || pr.role?.permissions?.admin?.manage_settings,
    );

  const hasMarinaAccess =
    isSuperAdmin || portRoles.some((pr) => pr.role?.permissions?.clients?.view);

  const hasResidentialAccess =
    isSuperAdmin ||
    portRoles.some((pr) => pr.residentialAccess || pr.role?.permissions?.residential_clients?.view);

  return (
    <>
      {/* Desktop sidebar */}
      <aside
        className={cn(
          'relative hidden md:flex flex-col h-screen border-r border-[#474e66] transition-all duration-200 ease-in-out shrink-0',
          sidebarCollapsed ? 'w-sidebar-collapsed' : 'w-sidebar',
        )}
        style={{ backgroundColor: '#1e2844' }}
      >
        <SidebarContent
          collapsed={sidebarCollapsed}
          portSlug={currentPortSlug ?? undefined}
          portRoles={portRoles}
          hasAdminAccess={hasAdminAccess}
          hasMarinaAccess={hasMarinaAccess}
          hasResidentialAccess={hasResidentialAccess}
          user={user}
          onToggleCollapse={toggleSidebar}
        />
      </aside>

      {/* Mobile drawer */}
      <Sheet>
        <SheetTrigger asChild>
          <Button
            variant="ghost"
            size="icon"
            className="md:hidden fixed top-3 left-3 z-50 text-white bg-[#1e2844] hover:bg-[#171f35]"
          >
            <Menu className="w-5 h-5" />
            <span className="sr-only">Open navigation</span>
          </Button>
        </SheetTrigger>
        <SheetContent side="left" className="p-0 w-sidebar border-r-0">
          <SidebarContent
            collapsed={false}
            portSlug={currentPortSlug ?? undefined}
            portRoles={portRoles}
            hasAdminAccess={hasAdminAccess}
            hasMarinaAccess={hasMarinaAccess}
            hasResidentialAccess={hasResidentialAccess}
          />
        </SheetContent>
      </Sheet>
    </>
  );
}
