"use client";
import NotificationMenu from "./NotificationMenu";

import { useEffect, useRef, useState, useTransition } from "react";
import Link from "next/link";
import { Avatar, Button, Dropdown, Label } from "@heroui/react";
import { ArrowUpRightFromSquare, ChevronDown, Menu, MessageSquare, Search } from "lucide-react";
import type { Session } from "next-auth";
import { logoutAction } from "@/app/actions/auth";
import { formatDisplayName } from "@/lib/format-display";
import { dashboardNavigation } from "@/lib/dashboard-navigation";
import ThemeToggle from "@/components/ui/ThemeToggle";
import { useSystemNotifications } from "@/components/ui/SystemNotifications";

type DashboardHeaderProps = {
  user: Session["user"];
  menuOpen: boolean;
  onOpenMenu: () => void;
  aula?: { id: number; nombre: string; clave: string };
};
export default function DashboardHeader({
  user,
  menuOpen,
  onOpenMenu,
  aula,
}: DashboardHeaderProps) {
  const [pending, startTransition] = useTransition();
  const [searchOpen, setSearchOpen] = useState(false);
  const header = useRef<HTMLElement>(null);
  const mobileSearch = useRef<HTMLInputElement>(null);
  const { clearNotifications } = useSystemNotifications();
  const name = formatDisplayName(user.name?.trim() || "Usuario");
  const initials = name
    .split(/\s+/)
    .slice(0, 2)
    .map((part) => part[0])
    .join("")
    .toUpperCase();
  useEffect(() => {
    const el = header.current;
    if (!el) return;
    const observer = new ResizeObserver((entries) =>
      document.documentElement.style.setProperty(
        "--system-header-height",
        `${entries[0].borderBoxSize[0]?.blockSize ?? el.getBoundingClientRect().height}px`,
      ),
    );
    observer.observe(el);
    return () => {
      observer.disconnect();
      document.documentElement.style.removeProperty("--system-header-height");
    };
  }, []);
  useEffect(() => {
    if (searchOpen) mobileSearch.current?.focus();
  }, [searchOpen]);
  return (
    <header
      ref={header}
      data-system-header
      className="sticky top-0 z-30 flex min-h-16 w-full shrink-0 flex-wrap items-center justify-between gap-x-3 border-b border-separator bg-surface/95 px-4 backdrop-blur sm:px-6"
    >
      <div className="flex min-w-0 flex-1 items-center gap-2 py-3">
        <Button
          isIconOnly
          variant="ghost"
          size="sm"
          onPress={onOpenMenu}
          aria-label="Abrir menú de navegación"
          aria-controls="mobile-dashboard-menu"
          aria-expanded={menuOpen}
          className="shrink-0 lg:hidden rounded-full"
        >
          <Menu className="size-5" />
        </Button>
        <Button
          isIconOnly
          variant="ghost"
          aria-label="Buscar cursos"
          aria-expanded={searchOpen}
          aria-controls="busqueda-movil"
          onPress={() => setSearchOpen((value) => !value)}
          className="size-9 shrink-0 rounded-full text-muted sm:hidden"
        >
          <Search className="size-4.5" />
        </Button>
        <form
          action="/cursos"
          method="GET"
          role="search"
          className="relative hidden w-full max-w-sm sm:block"
        >
          <Search
            className="pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted"
            aria-hidden="true"
          />
          <input
            name="q"
            type="search"
            aria-label="Buscar cursos"
            placeholder="Buscar cursos…"
            maxLength={120}
            className="h-9 w-full min-w-0 rounded-xl border border-transparent bg-default pr-3 pl-9 text-sm text-foreground outline-none placeholder:text-muted focus:border-accent/30 focus:bg-surface"
          />
        </form>
      </div>
      <div className="flex shrink-0 items-center gap-1 sm:gap-2">
        <NotificationMenu scope={aula?.id} />
        <ThemeToggle />
        <Link
          href="/foros"
          aria-label="Foro del aula"
          title="Foro del aula"
          className="inline-flex size-9 items-center justify-center rounded-full text-muted transition-colors hover:bg-default hover:text-foreground focus-visible:outline-2 focus-visible:outline-accent"
        >
          <MessageSquare className="size-4.5" aria-hidden="true" />
        </Link>
        <div className="mx-1 hidden h-7 w-px bg-separator sm:block" />
        <Dropdown>
          <Dropdown.Trigger
            aria-label={`Menú de usuario: ${name}`}
            className="flex min-w-0 items-center gap-2 rounded-xl px-1 py-1.5 outline-none transition-colors hover:bg-default focus-visible:ring-2 focus-visible:ring-accent sm:gap-3 sm:px-2"
          >
            <Avatar size="sm" className="shrink-0">
              <Avatar.Fallback className="bg-[#9d2449]/10 text-xs font-semibold text-[#9d2449]">
                {initials}
              </Avatar.Fallback>
            </Avatar>
            <span className="hidden min-w-0 text-left md:block">
              <span className="block max-w-48 truncate text-sm font-medium text-foreground">
                {name}
              </span>
              <span className="mt-0.5 block text-[11px] text-muted">
                {user.role === "alumno" ? "Alumno" : "Instructor"}
              </span>
            </span>
            <ChevronDown className="hidden size-3.5 text-muted md:block" />
          </Dropdown.Trigger>
          <Dropdown.Popover>
            <div className="max-w-64 px-3 pt-3 pb-2">
              <p className="text-sm font-medium">{name}</p>
              <p className="mt-1 text-xs text-muted">
                {user.role === "alumno" ? "Alumno" : "Instructor"}
              </p>
            </div>
            <Dropdown.Menu>
              {dashboardNavigation(user.role).map((item) => (
                <Dropdown.Item
                  key={item.href}
                  id={item.href}
                  textValue={item.label}
                  href={item.href}
                >
                  <Label>{item.label}</Label>
                </Dropdown.Item>
              ))}
              <Dropdown.Item
                id="logout"
                textValue="Cerrar sesión"
                variant="danger"
                isDisabled={pending}
                onAction={() =>
                  startTransition(async () => {
                    clearNotifications();
                    await logoutAction();
                  })
                }
              >
                <div className="flex w-full items-center justify-between gap-3">
                  <Label>{pending ? "Cerrando sesión…" : "Cerrar sesión"}</Label>
                  <ArrowUpRightFromSquare className="size-3.5" aria-hidden="true" />
                </div>
              </Dropdown.Item>
            </Dropdown.Menu>
          </Dropdown.Popover>
        </Dropdown>
      </div>
      {searchOpen && (
        <form
          id="busqueda-movil"
          action="/cursos"
          method="GET"
          role="search"
          className="order-last w-full pb-3 sm:hidden"
        >
          <input
            ref={mobileSearch}
            name="q"
            type="search"
            aria-label="Buscar cursos"
            placeholder="Buscar cursos…"
            maxLength={120}
            className="h-10 w-full rounded-xl border border-separator bg-default px-3 text-sm text-foreground outline-none focus:border-accent"
          />
        </form>
      )}
    </header>
  );
}
