"use client";

import { useState } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { BookOpen, User, LogOut, Globe, Menu, X, Search } from "lucide-react";
import { cn } from "@/lib/utils/cn";
import { useAuthStore } from "@/lib/store/auth-store";
import { authApi } from "@/lib/api/client";
import { useTranslation } from "@/lib/hooks/use-translation";
import { PublicMegaMenu, MobileDeskLinks } from "@/components/layout/public-mega-menu";
import { NotificationBell } from "@/components/layout/notification-bell";

export function Navbar() {
  const { user, isAuthenticated, setLanguage, logout } = useAuthStore();
  const { t, language } = useTranslation("NAVBAR");
  const router = useRouter();
  const [mobileOpen, setMobileOpen] = useState(false);
  const [searchQuery, setSearchQuery] = useState("");

  const handleSearch = (e: React.FormEvent) => {
    e.preventDefault();
    if (searchQuery.trim()) {
      router.push(`/journals?q=${encodeURIComponent(searchQuery.trim())}`);
      setSearchQuery("");
      setMobileOpen(false);
    }
  };

  const handleLogout = async () => {
    // Tell the server first: it revokes every session for this account. Without
    // this the client merely forgets its own copy and the token stays usable for
    // the rest of its life — which is exactly the case that matters when someone
    // logs out of a shared machine.
    try {
      await authApi.logout();
    } catch {
      // Already expired, offline, or the server is down. Clearing locally is
      // still the right thing to do, and is strictly better than staying signed in.
    }
    logout();
    router.push("/");
    setMobileOpen(false);
  };

  const toggleLanguage = () => {
    setLanguage(language === "hi" ? "en" : "hi");
  };

  const roleBadgeColor: Record<string, string> = {
    ADMIN: "bg-red-100 text-red-700",
    REVIEWER: "bg-amber-100 text-amber-700",
    AUTHOR: "bg-indigo-100 text-indigo-700",
  };

  return (
    <nav className="sticky top-0 z-50 bg-white border-b border-gray-200">
      <div className="mx-auto flex h-16 max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8">
        {/* Logo */}
        <Link href="/" className="flex items-center gap-2">
          <BookOpen className="h-6 w-6 text-indigo-600" />
          <span className="text-xl font-bold text-indigo-600">
            {t("nav.brand_name", "शोध संचयन")}
          </span>
        </Link>

        {/* Desktop navigation */}
        <div className="hidden items-center gap-6 md:flex">
          <Link
            href="/"
            className="text-sm font-medium text-gray-700 hover:text-indigo-600 transition-colors"
          >
            {t("nav.home", "Home")}
          </Link>
          <Link
            href="/journals"
            className="text-sm font-medium text-gray-700 hover:text-indigo-600 transition-colors"
          >
            {t("nav.journals", "Journals")}
          </Link>

          {/* Search */}
          <form onSubmit={handleSearch} className="relative">
            <Search className="absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400" />
            <input
              type="text"
              value={searchQuery}
              onChange={(e) => setSearchQuery(e.target.value)}
              placeholder={t("nav.search_placeholder", "Search papers...")}
              className="w-44 rounded-full border border-gray-300 bg-gray-50 py-1.5 pl-8 pr-3 text-xs text-gray-700 placeholder-gray-400 focus:border-indigo-400 focus:outline-none focus:ring-1 focus:ring-indigo-400"
            />
          </form>

          {/* Language toggle */}
          <button
            onClick={toggleLanguage}
            className="flex items-center gap-1.5 rounded-full border border-gray-300 px-3 py-1.5 text-xs font-medium text-gray-600 hover:border-indigo-400 hover:text-indigo-600 transition-colors"
          >
            <Globe className="h-3.5 w-3.5" />
            {t("nav.lang_toggle", language === "hi" ? "English" : "हिन्दी")}
          </button>

          {isAuthenticated && user ? (
            <div className="flex items-center gap-3">
              <NotificationBell />
              <div className="flex items-center gap-2">
                <User className="h-4 w-4 text-gray-500" />
                <span className="text-sm font-medium text-gray-700">
                  {language === "hi" ? user.nameHi : user.nameEn}
                </span>
                <span
                  className={cn(
                    "rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase",
                    roleBadgeColor[user.role] ?? "bg-gray-100 text-gray-700"
                  )}
                >
                  {user.role}
                </span>
              </div>
              <button
                onClick={handleLogout}
                className="flex items-center gap-1 rounded-md px-3 py-1.5 text-sm font-medium text-gray-600 hover:bg-red-50 hover:text-red-600 transition-colors"
              >
                <LogOut className="h-4 w-4" />
                {t("nav.logout", "Logout")}
              </button>
            </div>
          ) : (
            <Link
              href="/auth"
              className="rounded-md bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 transition-colors"
            >
              {t("nav.login", "Login")}
            </Link>
          )}
        </div>

        {/* Mobile hamburger */}
        <button
          onClick={() => setMobileOpen(!mobileOpen)}
          className="md:hidden p-2 text-gray-600 hover:text-indigo-600"
        >
          {mobileOpen ? (
            <X className="h-6 w-6" />
          ) : (
            <Menu className="h-6 w-6" />
          )}
        </button>
      </div>

      {/* Public desk bar (desktop) */}
      <PublicMegaMenu />

      {/* Mobile menu */}
      {mobileOpen && (
        <div className="absolute left-0 top-16 z-50 w-full border-b border-gray-200 bg-white shadow-lg md:hidden">
          <div className="flex flex-col gap-1 px-4 py-3">
            <Link
              href="/"
              onClick={() => setMobileOpen(false)}
              className="rounded-md px-3 py-2 text-sm font-medium text-gray-700 hover:bg-indigo-50 hover:text-indigo-600"
            >
              {t("nav.home", "Home")}
            </Link>
            <Link
              href="/journals"
              onClick={() => setMobileOpen(false)}
              className="rounded-md px-3 py-2 text-sm font-medium text-gray-700 hover:bg-indigo-50 hover:text-indigo-600"
            >
              {t("nav.journals", "Journals")}
            </Link>

            <div className="my-1 border-t border-gray-100" />

            {/* Public desks */}
            <MobileDeskLinks onNavigate={() => setMobileOpen(false)} />

            <button
              onClick={toggleLanguage}
              className="flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium text-gray-700 hover:bg-indigo-50 hover:text-indigo-600"
            >
              <Globe className="h-4 w-4" />
              {t("nav.lang_toggle", language === "hi" ? "English" : "हिन्दी")}
            </button>

            <div className="my-1 border-t border-gray-100" />

            {isAuthenticated && user ? (
              <>
                <div className="flex items-center gap-2 px-3 py-2">
                  <User className="h-4 w-4 text-gray-500" />
                  <span className="text-sm font-medium text-gray-700">
                    {language === "hi" ? user.nameHi : user.nameEn}
                  </span>
                  <span
                    className={cn(
                      "rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase",
                      roleBadgeColor[user.role] ?? "bg-gray-100 text-gray-700"
                    )}
                  >
                    {user.role}
                  </span>
                </div>
                <button
                  onClick={handleLogout}
                  className="flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium text-red-600 hover:bg-red-50"
                >
                  <LogOut className="h-4 w-4" />
                  {t("nav.logout", "Logout")}
                </button>
              </>
            ) : (
              <Link
                href="/auth"
                onClick={() => setMobileOpen(false)}
                className="rounded-md bg-indigo-600 mx-3 px-4 py-2 text-center text-sm font-medium text-white hover:bg-indigo-700"
              >
                {t("nav.login", "Login")}
              </Link>
            )}
          </div>
        </div>
      )}
    </nav>
  );
}
