"use client";

import { ChevronDown, Menu, X } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import { useEffect, useRef, useState } from "react";

import { buttonVariants } from "@/components/ui/button";
import { navigationItems } from "@/data/navigation";
import { cn } from "@/lib/utils";

import logoImage from "../../../../public/images/TIAR.png";

export function Navbar() {
  const [openDropdownId, setOpenDropdownId] = useState<string | null>(null);
  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
  const navigationRef = useRef<HTMLElement>(null);

  useEffect(() => {
    function handlePointerDown(event: PointerEvent) {
      if (
        navigationRef.current &&
        !navigationRef.current.contains(event.target as Node)
      ) {
        setOpenDropdownId(null);
        setIsMobileMenuOpen(false);
      }
    }

    function handleKeyDown(event: KeyboardEvent) {
      if (event.key === "Escape") {
        setOpenDropdownId(null);
        setIsMobileMenuOpen(false);
      }
    }

    document.addEventListener("pointerdown", handlePointerDown);
    document.addEventListener("keydown", handleKeyDown);

    return () => {
      document.removeEventListener("pointerdown", handlePointerDown);
      document.removeEventListener("keydown", handleKeyDown);
    };
  }, []);

  function handleDropdownToggle(dropdownId: string) {
    setOpenDropdownId((currentId) =>
      currentId === dropdownId ? null : dropdownId,
    );
  }

  function handleMobileMenuToggle() {
    setIsMobileMenuOpen((isOpen) => !isOpen);
    setOpenDropdownId(null);
  }

  function handleNavigationLinkClick() {
    setOpenDropdownId(null);
    setIsMobileMenuOpen(false);
  }

  return (
    <>
      <aside
        aria-label="Pengumuman"
        className="w-full max-w-[100vw] bg-green-700 px-6 py-2.5 text-center text-sm text-white"
      >
        Worried about migrating from your legacy architecture?
        <Link
          href="/book-demo"
          className="ml-2 inline-block rounded-sm font-semibold underline decoration-green-300 underline-offset-4 hover:decoration-white focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white"
        >
          Watch now.
        </Link>
      </aside>

      <header className="sticky top-0 z-40 w-full max-w-[100vw] bg-white/90 px-3 py-3 backdrop-blur-md sm:px-5">
        <nav
          ref={navigationRef}
          aria-label="Navigasi utama"
          className="mx-auto grid w-full max-w-7xl grid-cols-[1fr_auto] items-center rounded-2xl border border-green-100 bg-white px-4 py-2 shadow-sm sm:px-5 lg:grid-cols-[1fr_auto_1fr]"
        >
          <Link
            href="/"
            aria-label="Kembali ke halaman utama"
            onClick={handleNavigationLinkClick}
            className="justify-self-start rounded-md focus-visible:ring-2 focus-visible:ring-green-600 focus-visible:ring-offset-2 focus-visible:outline-none"
          >
            <Image src={logoImage} alt="TIAR" className="w-auto h-15" />
          </Link>

          <button
            type="button"
            aria-label={
              isMobileMenuOpen ? "Tutup menu navigasi" : "Buka menu navigasi"
            }
            aria-expanded={isMobileMenuOpen}
            aria-controls="mobile-navigation-menu"
            onClick={handleMobileMenuToggle}
            className="flex size-11 items-center justify-center justify-self-end rounded-xl text-gray-900 transition-colors hover:bg-green-50 focus-visible:ring-2 focus-visible:ring-green-600 focus-visible:outline-none lg:hidden"
          >
            {isMobileMenuOpen ? (
              <X aria-hidden="true" className="size-6" />
            ) : (
              <Menu aria-hidden="true" className="size-6" />
            )}
          </button>

          <ul
            id="mobile-navigation-menu"
            className={cn(
              "col-span-2 mt-2 w-full flex-col gap-1 border-t border-green-100 pt-2 lg:col-span-1 lg:col-start-2 lg:row-start-1 lg:mt-0 lg:w-auto lg:flex-row lg:items-center lg:gap-1 lg:justify-self-center lg:border-t-0 lg:pt-0 xl:gap-2",
              isMobileMenuOpen ? "flex" : "hidden lg:flex",
            )}
          >
            {navigationItems.map((navigationItem) => (
              <li key={navigationItem.id} className="relative w-full lg:w-auto">
                <button
                  type="button"
                  aria-expanded={openDropdownId === navigationItem.id}
                  aria-controls={`${navigationItem.id}-submenu`}
                  onClick={() => handleDropdownToggle(navigationItem.id)}
                  className="flex w-full items-center justify-between gap-1.5 rounded-lg px-3 py-3 text-sm font-medium text-gray-800 transition-colors hover:bg-green-50 hover:text-green-700 focus-visible:ring-2 focus-visible:ring-green-600 focus-visible:outline-none lg:w-auto lg:px-2.5 lg:py-2 xl:text-base"
                >
                  {navigationItem.label}

                  <ChevronDown
                    aria-hidden="true"
                    className={cn(
                      "size-4 transition-transform",
                      openDropdownId === navigationItem.id && "rotate-180",
                    )}
                  />
                </button>

                {openDropdownId === navigationItem.id ? (
                  <ul
                    id={`${navigationItem.id}-submenu`}
                    className="z-20 mt-1 w-full rounded-xl border border-green-100 bg-white p-2 shadow-xl lg:absolute lg:top-full lg:left-1/2 lg:mt-3 lg:min-w-60 lg:-translate-x-1/2"
                  >
                    {"items" in navigationItem
                      ? navigationItem.items.map((submenuItem) => (
                          <li key={submenuItem.href}>
                            <Link
                              href={submenuItem.href}
                              onClick={handleNavigationLinkClick}
                              className="block rounded-lg px-3 py-2 text-sm text-gray-700 transition-colors hover:bg-green-50 hover:text-green-800 focus-visible:ring-2 focus-visible:ring-green-600 focus-visible:outline-none"
                            >
                              {submenuItem.label}
                            </Link>
                          </li>
                        ))
                      : navigationItem.groups.map((navigationGroup) => (
                          <li key={navigationGroup.id}>
                            <p className="px-3 pt-3 pb-1 text-xs font-semibold tracking-wider text-green-700 uppercase">
                              {navigationGroup.label}
                            </p>

                            <ul>
                              {navigationGroup.items.map((submenuItem) => (
                                <li
                                  className="pl-3"
                                  key={`${navigationGroup.id}-${submenuItem.label}`}
                                >
                                  <Link
                                    href={submenuItem.href}
                                    onClick={handleNavigationLinkClick}
                                    className="block rounded-lg px-3 py-2 text-sm text-gray-700 transition-colors hover:bg-green-50 hover:text-green-800 focus-visible:ring-2 focus-visible:ring-green-600 focus-visible:outline-none"
                                  >
                                    {submenuItem.label}
                                  </Link>
                                </li>
                              ))}
                            </ul>
                          </li>
                        ))}
                  </ul>
                ) : null}
              </li>
            ))}

            <li className="mt-2 w-full pb-2 lg:hidden">
              <Link
                href="/book-demo"
                onClick={handleNavigationLinkClick}
                className={cn(
                  buttonVariants({ size: "lg" }),
                  "w-full bg-green-600 text-white hover:bg-green-700",
                )}
              >
                Book a Demo
              </Link>
            </li>
          </ul>

          <Link
            href="/book-demo"
            onClick={handleNavigationLinkClick}
            className={cn(
              buttonVariants({ size: "lg" }),
              "hidden justify-self-end bg-green-600 text-white shadow-sm hover:bg-green-700 lg:inline-flex",
            )}
          >
            Book a Demo
          </Link>
        </nav>
      </header>
    </>
  );
}
