"use client";

import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useRef, useState } from "react";
import { AdminUser, clearToken, getStoredUser } from "@/lib/api";
import { mediaUrl } from "@/lib/media";
import { exitImpersonation } from "@/lib/impersonation";
import { clearSessionContext, isImpersonating } from "@/lib/session-context";

function UserAvatar({ name, src }: { name: string; src?: string | null }) {
  const initials = name
    .split(/\s+/)
    .filter(Boolean)
    .slice(0, 2)
    .map((p) => p[0])
    .join("");

  if (src) {
    return (
      // eslint-disable-next-line @next/next/no-img-element
      <img
        src={src}
        alt={name}
        className="h-9 w-9 rounded-full border-2 border-white/40 object-cover"
      />
    );
  }

  return (
    <div className="flex h-9 w-9 items-center justify-center rounded-full border-2 border-white/40 bg-white/20 text-sm font-bold text-white">
      {initials || "؟"}
    </div>
  );
}

export function HeaderUserMenu() {
  const router = useRouter();
  const user = getStoredUser<AdminUser>();
  const [open, setOpen] = useState(false);
  const rootRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (!open) return;
    const close = (e: MouseEvent) => {
      if (rootRef.current && !rootRef.current.contains(e.target as Node)) {
        setOpen(false);
      }
    };
    window.addEventListener("click", close);
    return () => window.removeEventListener("click", close);
  }, [open]);

  if (!user) return null;

  const logout = () => {
    if (isImpersonating() && exitImpersonation("/staff")) {
      return;
    }
    clearToken();
    router.replace("/login");
  };

  const changeRole = () => {
    clearSessionContext();
    router.replace("/select-context");
  };

  return (
    <div ref={rootRef} className="relative shrink-0">
      <button
        type="button"
        className="flex items-center gap-2 rounded-xl bg-white/15 px-2 py-1.5 transition hover:bg-white/25"
        onClick={(e) => {
          e.stopPropagation();
          setOpen((v) => !v);
        }}
        aria-expanded={open}
        aria-haspopup="menu"
      >
        <UserAvatar name={user.name} src={mediaUrl(user.avatar_path)} />
        <span className="hidden max-w-[8rem] truncate text-xs font-medium sm:inline">
          {user.name}
        </span>
        <svg viewBox="0 0 24 24" className="h-4 w-4 opacity-80" fill="currentColor" aria-hidden>
          <path d="M7 10l5 5 5-5z" />
        </svg>
      </button>

      {open ? (
        <div
          className="absolute left-0 top-full z-50 mt-2 min-w-[12rem] overflow-hidden rounded-xl border border-[var(--border)] bg-white py-1 text-sm text-foreground shadow-lg"
          role="menu"
        >
          <Link
            href="/account"
            className="block px-4 py-2.5 text-right hover:bg-slate-50"
            onClick={() => setOpen(false)}
            role="menuitem"
          >
            مشاهده پروفایل کاربری
          </Link>
          <Link
            href="/change-password"
            className="block px-4 py-2.5 text-right hover:bg-slate-50"
            onClick={() => setOpen(false)}
            role="menuitem"
          >
            تغییر رمز عبور
          </Link>
          <Link
            href="/support"
            className="block px-4 py-2.5 text-right hover:bg-slate-50"
            onClick={() => setOpen(false)}
            role="menuitem"
          >
            مرکز راهنما
          </Link>
          <button
            type="button"
            className="block w-full px-4 py-2.5 text-right hover:bg-slate-50"
            onClick={() => {
              setOpen(false);
              changeRole();
            }}
            role="menuitem"
          >
            تغییر نقش
          </button>
          <div className="my-1 border-t border-[var(--border)]" />
          <button
            type="button"
            className="block w-full px-4 py-2.5 text-right text-red-600 hover:bg-red-50"
            onClick={() => {
              setOpen(false);
              logout();
            }}
            role="menuitem"
          >
            خروج
          </button>
        </div>
      ) : null}
    </div>
  );
}
