"use client";

import { toastApiError } from "@/lib/toast-api-error";
import Link from "next/link";
import { useState } from "react";
import { LogOut, Settings, ShieldAlert, UserRound } from "lucide-react";
import {
  exitCustomerImpersonation,
  logoutBackend,
  logoutCustomer,
  type ImpersonationType,
} from "@/lib/auth/logout-client";
import { customerUrl } from "@/lib/tenant";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import { Badge } from "@/components/ui/badge";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { getInitials } from "@/lib/utils";

export type HeaderUser = {
  readonly name: string;
  readonly email: string;
  readonly avatar: string;
};

type AccountSwitcherProps = {
  readonly user: HeaderUser;
  readonly tenant?: string | null;
  readonly impersonated?: boolean;
  readonly impersonationType?: ImpersonationType | null;
};

export function AccountSwitcher({
  user,
  tenant = null,
  impersonated = false,
  impersonationType = null,
}: AccountSwitcherProps) {
  const [busy, setBusy] = useState(false);
  const settingsHref = tenant ? customerUrl(tenant, "/settings") : "/dashboard/settings";
  const type: ImpersonationType = impersonationType === "corporate" ? "corporate" : "admin";
  const exitLabel = type === "corporate" ? "Return to my account" : "Exit impersonation";

  async function handleExitImpersonation() {
    if (!tenant) {
      return;
    }
    setBusy(true);
    try {
      await exitCustomerImpersonation(tenant, type);
    } catch (error) {
      setBusy(false);
      toastApiError(error, "Could not end impersonation.");
    }
  }

  async function handleLogout() {
    setBusy(true);
    try {
      if (tenant) {
        // Full logout (even while impersonating) — dedicated Exit handles restore.
        await logoutCustomer(tenant);
        return;
      }

      await logoutBackend();
    } catch (error) {
      setBusy(false);
      toastApiError(error, "Could not log out.");
    }
  }

  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <button
          type="button"
          className="inline-flex items-center gap-2 rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-ring"
          aria-label="Account menu"
          disabled={busy}
        >
          <div className="hidden min-w-0 text-right sm:block">
            <p className="truncate text-sm font-medium leading-tight">{user.name}</p>
            <p className="truncate text-xs text-muted-foreground leading-tight">{user.email}</p>
          </div>
          <Avatar className="size-8 rounded-lg">
            <AvatarImage src={user.avatar || undefined} alt={user.name} />
            <AvatarFallback className="rounded-lg">{getInitials(user.name)}</AvatarFallback>
          </Avatar>
        </button>
      </DropdownMenuTrigger>
      <DropdownMenuContent className="min-w-56 rounded-lg" side="bottom" align="end" sideOffset={4}>
        <DropdownMenuLabel className="p-0 font-normal">
          <div className="flex items-start gap-2 px-1 py-1.5">
            <Avatar className="size-9 rounded-lg">
              <AvatarImage src={user.avatar || undefined} alt={user.name} />
              <AvatarFallback className="rounded-lg">{getInitials(user.name)}</AvatarFallback>
            </Avatar>
            <div className="grid min-w-0 flex-1 gap-1 text-left text-sm leading-tight">
              <div className="flex flex-wrap items-center gap-1.5">
                <span className="truncate font-semibold">{user.name}</span>
                {impersonated ? (
                  <Badge variant="secondary" className="rounded-full">
                    <ShieldAlert className="size-3" />
                    {type === "corporate" ? "Sub-user" : "Impersonated"}
                  </Badge>
                ) : null}
              </div>
              <span className="truncate text-xs text-muted-foreground">{user.email}</span>
            </div>
          </div>
        </DropdownMenuLabel>
        <DropdownMenuSeparator />
        {!tenant ? (
          <DropdownMenuItem asChild>
            <Link href="/dashboard/account">
              <UserRound />
              Account
            </Link>
          </DropdownMenuItem>
        ) : null}
        <DropdownMenuItem asChild>
          <Link href={settingsHref}>
            <Settings />
            Settings
          </Link>
        </DropdownMenuItem>
        {impersonated && tenant ? (
          <DropdownMenuItem disabled={busy} onClick={() => void handleExitImpersonation()}>
            {type === "corporate" ? <UserRound /> : <ShieldAlert />}
            {exitLabel}
          </DropdownMenuItem>
        ) : null}
        <DropdownMenuItem disabled={busy} onClick={() => void handleLogout()}>
          <LogOut />
          Log out
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}
