import { useState, useMemo } from 'react';
import { NavLink, useLocation, useNavigate } from 'react-router-dom';
import {
  Activity, BarChart3, Calculator, CalendarDays, ChevronDown, ClipboardCheck, ClipboardList, Database, Info, LayoutGrid, LogOut, Map, Menu, Receipt,
  Search, Settings, ShieldCheck, Tag, TrendingDown, User, X,
  Repeat,
} from 'lucide-react';
import { cn } from '@/lib/utils';
import { useAuth } from '@/hooks/useAuth';
import { useOverdueCount } from '@/hooks/useQueries';
import { ThemeToggle } from '@/components/ui/theme-toggle';
import { Button } from '@/components/ui/button';
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { NavPill } from './NavPill';
import { BrandBlock } from './BrandBlock';

const userNavItems = [
  { to: '/calendar',   icon: CalendarDays, label: 'Calendar' },
  { to: '/analytics',  icon: BarChart3,  label: 'Analytics' },
];

const adminNavItems = [
  { to: '/', icon: LayoutGrid, label: 'Tracker', end: true },
  { to: '/admin', icon: ShieldCheck, label: 'Admin Panel', end: true },
  { to: '/admin/status', icon: Activity, label: 'System Status' },
  { to: '/roadmap', icon: Map, label: 'Roadmap' },
];

const trackerItems = [
  { to: '/', icon: LayoutGrid, label: 'Overview', end: true },
  { to: '/summary', icon: ClipboardList, label: 'Summary' },
  { to: '/bills', icon: Receipt, label: 'Bills' },
  { to: '/subscriptions', icon: Repeat, label: 'Subscriptions' },
  { to: '/categories', icon: Tag, label: 'Categories' },
  { to: '/health', icon: ClipboardCheck, label: 'Health' },
  { to: '/snowball', icon: TrendingDown, label: 'Snowball' },
  { to: '/payoff',   icon: Calculator,  label: 'Payoff' },
];

function TrackerMenu({ onNavigate, badge }) {
  const location = useLocation();
  const navigate = useNavigate();
  const isTrackerActive = useMemo(() => trackerItems.some(item => (
    item.end ? location.pathname === item.to : location.pathname.startsWith(item.to)
  )), [location.pathname]);

  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <button
          className={cn(
            'inline-flex items-center gap-2 rounded-full px-3 py-2 text-sm font-medium transition-all',
            'focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',
            isTrackerActive
              ? 'bg-primary text-primary-foreground shadow-sm shadow-primary/20'
              : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground hover:shadow-sm',
          )}
          aria-expanded={isTrackerActive}
          aria-haspopup="menu"
        >
          <LayoutGrid className="h-4 w-4" />
          Tracker
          {badge > 0 && (
            <span className="flex h-4 min-w-[1rem] items-center justify-center rounded-full bg-rose-500 px-1 text-[10px] font-bold leading-none text-white">
              {badge > 99 ? '99+' : badge}
            </span>
          )}
          <ChevronDown className="h-3.5 w-3.5 opacity-75" />
        </button>
      </DropdownMenuTrigger>
      <DropdownMenuContent align="start" className="w-48">
        {trackerItems.map(item => {
          const Icon = item.icon;
          return (
            <DropdownMenuItem key={item.to} onSelect={() => { navigate(item.to); onNavigate?.(); }}>
              <Icon className="h-4 w-4" />
              {item.label}
            </DropdownMenuItem>
          );
        })}
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

function UserMenu({ adminMode = false }) {
  const { user, logout } = useAuth();
  const navigate = useNavigate();
  const name = useMemo(() => 
    user?.display_name || user?.username || (adminMode ? 'Admin' : 'Profile'), 
    [user, adminMode]
  );
  const accountToolsAllowed = useMemo(() => !user?.is_default_admin, [user]);
  const userRole = useMemo(() => user?.role, [user]);

  const handleLogout = async () => {
    try { await logout(); } catch {}
    navigate('/login', { replace: true });
  };

  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <button
          className="inline-flex h-9 items-center gap-2 rounded-full border border-border/80 bg-muted px-2.5 text-sm font-medium text-foreground shadow-sm transition-all hover:bg-accent hover:text-accent-foreground hover:shadow focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
          aria-label="Open user menu"
        >
          <span className="flex h-6 w-6 items-center justify-center rounded-full bg-primary/10 text-primary">
            <User className="h-3.5 w-3.5" />
          </span>
          <span className="hidden max-w-[140px] truncate sm:inline">{name}</span>
          <ChevronDown className="h-3.5 w-3.5 text-muted-foreground" />
        </button>
      </DropdownMenuTrigger>
      <DropdownMenuContent align="end" className="w-52">
        <DropdownMenuLabel className="truncate">{name}</DropdownMenuLabel>
        <DropdownMenuSeparator />
        {userRole === 'admin' && !adminMode && (
          <>
            <DropdownMenuItem onSelect={() => navigate('/admin')}>
              <ShieldCheck className="h-4 w-4" />
              Admin Panel
            </DropdownMenuItem>
            <DropdownMenuItem onSelect={() => navigate('/admin/status')}>
              <Activity className="h-4 w-4" />
              System Status
            </DropdownMenuItem>
            <DropdownMenuSeparator />
          </>
        )}
        {accountToolsAllowed && (
          <>
            <DropdownMenuItem onSelect={() => navigate('/profile')}>
              <User className="h-4 w-4" />
              Profile
            </DropdownMenuItem>
            <DropdownMenuItem onSelect={() => navigate('/settings')}>
              <Settings className="h-4 w-4" />
              Settings
            </DropdownMenuItem>
            <DropdownMenuItem onSelect={() => navigate('/data')}>
              <Database className="h-4 w-4" />
              Data
            </DropdownMenuItem>
            <DropdownMenuSeparator />
          </>
        )}
        <DropdownMenuItem onSelect={() => navigate('/about')}>
          <Info className="h-4 w-4" />
          About
        </DropdownMenuItem>
        {user?.role === 'admin' && (
          <DropdownMenuItem onSelect={() => navigate('/roadmap')}>
            <Map className="h-4 w-4" />
            Roadmap
          </DropdownMenuItem>
        )}
        <DropdownMenuSeparator />
        <DropdownMenuItem destructive onSelect={handleLogout}>
          <LogOut className="h-4 w-4" />
          Logout
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

export default function Sidebar({ adminMode = false }) {
  const [mobileOpen, setMobileOpen] = useState(false);
  const { user } = useAuth();
  const items = useMemo(() => adminMode ? adminNavItems : userNavItems, [adminMode]);
  const { data: overdueData } = useOverdueCount();
  const overdueCount = (!adminMode && overdueData?.count) ? overdueData.count : 0;

  return (
    <header className="sticky top-0 z-40 border-b border-border/80 bg-card/95 shadow-sm shadow-foreground/10 backdrop-blur-md supports-[backdrop-filter]:bg-card/90">
      <div className="mx-auto flex h-16 w-full max-w-[1500px] items-center gap-4 px-4 sm:px-6 lg:px-8">
        <BrandBlock adminMode={adminMode} />

        <nav className="hidden items-center gap-1 lg:flex">
          {!adminMode && <TrackerMenu badge={overdueCount} />}
          {items.map(item => (
            <NavPill key={item.to} item={item} />
          ))}
        </nav>

        <div className="ml-auto flex items-center gap-2">
          {!adminMode && (
            <Button
              type="button"
              variant="outline"
              className="hidden h-9 gap-2 rounded-full bg-muted px-3 text-muted-foreground shadow-sm md:inline-flex"
              onClick={() => window.dispatchEvent(new Event('command-palette:open'))}
              title="Find a bill"
            >
              <Search className="h-4 w-4" />
              <span className="text-sm">Find</span>
              <kbd className="rounded border border-border bg-background px-1.5 py-0.5 text-[10px] font-semibold text-muted-foreground">
                Ctrl K
              </kbd>
            </Button>
          )}
          <ThemeToggle className="rounded-full border border-border/80 bg-muted shadow-sm" />
          <UserMenu adminMode={adminMode} />
          <Button
            type="button"
            variant="outline"
            size="icon"
            className="lg:hidden rounded-full bg-muted"
            aria-label={mobileOpen ? 'Close navigation menu' : 'Open navigation menu'}
            aria-expanded={mobileOpen}
            onClick={() => setMobileOpen(v => !v)}
          >
            {mobileOpen ? <X className="h-4 w-4" /> : <Menu className="h-4 w-4" />}
          </Button>
        </div>
      </div>

      {mobileOpen && (
        <div className="max-h-[70vh] overflow-y-auto border-t border-border/70 bg-card/95 px-4 py-3 shadow-lg shadow-foreground/10 lg:hidden">
          <nav className="mx-auto grid max-w-[1500px] gap-1">
            {!adminMode && trackerItems.map(item => (
              <NavPill
                key={item.to}
                item={item}
                onNavigate={() => setMobileOpen(false)}
                badge={item.to === '/' ? overdueCount : undefined}
              />
            ))}
            {items.map(item => (
              <NavPill key={item.to} item={item} onNavigate={() => setMobileOpen(false)} />
            ))}
          </nav>
        </div>
      )}
    </header>
  );
}
