"use client";

import Link from "next/link";
import { usePathname, useRouter } from "next/navigation";
import {
  LayoutDashboard,
  FileText,
  Users,
  Tags,
  Heart,
  Bell,
  Settings,
  Landmark,
  LogOut,
  X,
} from "lucide-react";
import { useQueryClient } from "@tanstack/react-query";
import { cn } from "@/lib/utils";
import { ThemeToggle } from "./ThemeToggle";
import { useAuthStore } from "@/stores/authStore";

const NAV = [
  { href: "/", label: "Dashboard", icon: LayoutDashboard, adminOnly: false, requiresAuth: false },
  { href: "/bills", label: "Bills", icon: FileText, adminOnly: false, requiresAuth: false },
  { href: "/members", label: "Members", icon: Users, adminOnly: false, requiresAuth: false },
  { href: "/topics", label: "Topics", icon: Tags, adminOnly: false, requiresAuth: false },
  { href: "/following", label: "Following", icon: Heart, adminOnly: false, requiresAuth: true },
  { href: "/notifications", label: "Notifications", icon: Bell, adminOnly: false, requiresAuth: true },
  { href: "/settings", label: "Admin", icon: Settings, adminOnly: true, requiresAuth: false },
];

export function Sidebar({ onClose }: { onClose?: () => void }) {
  const pathname = usePathname();
  const router = useRouter();
  const qc = useQueryClient();
  const user = useAuthStore((s) => s.user);
  const token = useAuthStore((s) => s.token);
  const logout = useAuthStore((s) => s.logout);

  function handleLogout() {
    logout();
    qc.clear();
    router.replace("/login");
  }

  return (
    <aside className="w-56 shrink-0 border-r border-border bg-card flex flex-col">
      <div className="p-4 border-b border-border flex items-center gap-2">
        <Landmark className="w-5 h-5 text-primary" />
        <span className="font-semibold text-sm flex-1">PocketVeto</span>
        {onClose && (
          <button onClick={onClose} className="p-1 rounded-md hover:bg-accent transition-colors" aria-label="Close menu">
            <X className="w-4 h-4" />
          </button>
        )}
      </div>

      <nav className="flex-1 p-3 space-y-1">
        {NAV.filter(({ adminOnly, requiresAuth }) => {
          if (adminOnly && !user?.is_admin) return false;
          if (requiresAuth && !token) return false;
          return true;
        }).map(({ href, label, icon: Icon }) => {
          const active = href === "/" ? pathname === "/" : pathname.startsWith(href);
          return (
            <Link
              key={href}
              href={href}
              onClick={onClose}
              className={cn(
                "flex items-center gap-3 px-3 py-2 rounded-md text-sm transition-colors",
                active
                  ? "bg-primary text-primary-foreground"
                  : "text-muted-foreground hover:bg-accent hover:text-accent-foreground"
              )}
            >
              <Icon className="w-4 h-4 shrink-0" />
              {label}
            </Link>
          );
        })}
      </nav>

      <div className="p-3 border-t border-border space-y-2">
        {token ? (
          <>
            {user && (
              <div className="flex items-center justify-between">
                <span className="text-xs text-muted-foreground truncate max-w-[120px]" title={user.email}>
                  {user.email}
                </span>
                <button
                  onClick={handleLogout}
                  className="p-1 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent"
                  title="Sign out"
                >
                  <LogOut className="w-3.5 h-3.5" />
                </button>
              </div>
            )}
          </>
        ) : (
          <div className="flex flex-col gap-2">
            <Link href="/register" onClick={onClose} className="w-full px-3 py-1.5 text-sm font-medium text-center rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors">
              Register
            </Link>
            <Link href="/login" onClick={onClose} className="w-full px-3 py-1.5 text-sm font-medium text-center rounded-md border border-border text-foreground hover:bg-accent transition-colors">
              Sign in
            </Link>
          </div>
        )}
        <div className="flex items-center justify-between">
          <span className="text-xs text-muted-foreground">Theme</span>
          <ThemeToggle />
        </div>
      </div>
    </aside>
  );
}
