"use client";

import * as React from "react";
import {
  Ban,
  CircleCheck,
  Clock,
  KeyRound,
  LogIn,
  MoreHorizontal,
  Network,
  Percent,
  SlidersHorizontal,
  UserPen,
  Wallet,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
  adjustUserFundsAction,
  loginAsUserAction,
  setUserDiscountAction,
  setUserPasswordAction,
  setUserStatusAction,
} from "@/lib/actions/admin-users";
import { adminUsersTexts } from "@/lib/i18n/admin-users";
import { TextField, UserActionForm, UserDialog } from "./dialog-shell";
import { EditUserDialog } from "./edit-user-dialog";
import { CustomRatesDialog } from "./custom-rates-dialog";
import { SameIpDialog, SignInHistoryDialog } from "./history-dialogs";
import type { AdminUserSummary } from "./types";

const t = adminUsersTexts;

type DialogKey =
  | "edit"
  | "password"
  | "funds"
  | "discount"
  | "rates"
  | "signin"
  | "sameip"
  | "status"
  | "loginAs"
  | null;

export function UsersRowActions({
  user,
  isAdmin,
  isSelf,
}: {
  user: AdminUserSummary;
  /** The signed-in admin is a full ADMIN (not STAFF). */
  isAdmin: boolean;
  isSelf: boolean;
}) {
  const [dialog, setDialog] = React.useState<DialogKey>(null);
  const close = React.useCallback(() => setDialog(null), []);
  const suspended = user.status === "SUSPENDED";

  return (
    <>
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <Button
            type="button"
            variant="ghost"
            size="icon-sm"
            aria-label={t.actions.menuLabel}
          >
            <MoreHorizontal className="size-4" />
          </Button>
        </DropdownMenuTrigger>

        <DropdownMenuContent align="end" className="w-56">
          <DropdownMenuLabel className="text-[11px]">
            {t.actions.sections.profile}
          </DropdownMenuLabel>
          <DropdownMenuItem className="cursor-pointer" onSelect={() => setDialog("edit")}>
            <UserPen className="size-3.5" />
            {t.actions.edit}
          </DropdownMenuItem>
          <DropdownMenuItem
            className="cursor-pointer"
            onSelect={() => setDialog("password")}
          >
            <KeyRound className="size-3.5" />
            {t.actions.setPassword}
          </DropdownMenuItem>

          <DropdownMenuSeparator />
          <DropdownMenuLabel className="text-[11px]">
            {t.actions.sections.money}
          </DropdownMenuLabel>
          <DropdownMenuItem className="cursor-pointer" onSelect={() => setDialog("funds")}>
            <Wallet className="size-3.5" />
            {t.actions.funds}
          </DropdownMenuItem>
          <DropdownMenuItem
            className="cursor-pointer"
            onSelect={() => setDialog("discount")}
          >
            <Percent className="size-3.5" />
            {t.actions.discount}
          </DropdownMenuItem>
          <DropdownMenuItem className="cursor-pointer" onSelect={() => setDialog("rates")}>
            <SlidersHorizontal className="size-3.5" />
            {t.actions.customRates}
          </DropdownMenuItem>

          <DropdownMenuSeparator />
          <DropdownMenuLabel className="text-[11px]">
            {t.actions.sections.security}
          </DropdownMenuLabel>
          <DropdownMenuItem
            className="cursor-pointer"
            onSelect={() => setDialog("signin")}
          >
            <Clock className="size-3.5" />
            {t.actions.signInHistory}
          </DropdownMenuItem>
          <DropdownMenuItem
            className="cursor-pointer"
            onSelect={() => setDialog("sameip")}
          >
            <Network className="size-3.5" />
            {t.actions.sameIp}
          </DropdownMenuItem>
          <DropdownMenuItem
            className="cursor-pointer"
            variant={suspended ? "default" : "destructive"}
            onSelect={() => setDialog("status")}
          >
            {suspended ? (
              <CircleCheck className="size-3.5" />
            ) : (
              <Ban className="size-3.5" />
            )}
            {suspended ? t.actions.activate : t.actions.suspend}
          </DropdownMenuItem>
          {isAdmin && !isSelf && user.role !== "ADMIN" ? (
            <DropdownMenuItem
              className="cursor-pointer"
              onSelect={() => setDialog("loginAs")}
            >
              <LogIn className="size-3.5" />
              {t.actions.loginAs}
            </DropdownMenuItem>
          ) : null}
        </DropdownMenuContent>
      </DropdownMenu>

      {/* ------------------------------------------------------- rich dialogs */}

      <EditUserDialog
        userId={user.id}
        open={dialog === "edit"}
        onOpenChange={(open) => (open ? setDialog("edit") : close())}
        canChangeRole={isAdmin}
      />

      <CustomRatesDialog
        userId={user.id}
        username={user.username}
        open={dialog === "rates"}
        onOpenChange={(open) => (open ? setDialog("rates") : close())}
      />

      <SignInHistoryDialog
        userId={user.id}
        username={user.username}
        open={dialog === "signin"}
        onOpenChange={(open) => (open ? setDialog("signin") : close())}
      />

      <SameIpDialog
        userId={user.id}
        username={user.username}
        open={dialog === "sameip"}
        onOpenChange={(open) => (open ? setDialog("sameip") : close())}
      />

      {/* ------------------------------------------------------ small dialogs */}

      <UserDialog
        open={dialog === "password"}
        onOpenChange={(open) => (open ? setDialog("password") : close())}
        title={`${t.password.title} · ${user.username}`}
        description={t.password.description}
      >
        <UserActionForm
          action={setUserPasswordAction}
          submitLabel={t.password.submit}
          successMessage={t.toast.passwordSet}
          onDone={close}
          onCancel={close}
        >
          {(fieldErrors) => (
            <>
              <input type="hidden" name="id" value={user.id} />
              <TextField
                name="password"
                label={t.password.field}
                type="password"
                required
                hint={t.password.hint}
                error={fieldErrors.password}
              />
            </>
          )}
        </UserActionForm>
      </UserDialog>

      <UserDialog
        open={dialog === "funds"}
        onOpenChange={(open) => (open ? setDialog("funds") : close())}
        title={`${t.funds.title} · ${user.username}`}
        description={t.funds.description}
      >
        <UserActionForm
          action={adjustUserFundsAction}
          submitLabel={t.funds.submit}
          successMessage={t.toast.fundsApplied}
          onDone={close}
          onCancel={close}
          footerExtra={
            <span className="text-[11px] text-muted-foreground">
              {t.funds.current}:{" "}
              <span className="font-mono tabular-nums">{user.balance}</span>
            </span>
          }
        >
          {(fieldErrors) => (
            <>
              <input type="hidden" name="id" value={user.id} />
              <TextField
                name="amount"
                label={t.funds.amount}
                placeholder="-10.50"
                required
                error={fieldErrors.amount}
              />
              <TextField
                name="reason"
                label={t.funds.reason}
                placeholder={t.funds.reasonPlaceholder}
                required
                error={fieldErrors.reason}
              />
            </>
          )}
        </UserActionForm>
      </UserDialog>

      <UserDialog
        open={dialog === "discount"}
        onOpenChange={(open) => (open ? setDialog("discount") : close())}
        title={`${t.discount.title} · ${user.username}`}
        description={t.discount.description}
      >
        <UserActionForm
          action={setUserDiscountAction}
          submitLabel={t.discount.submit}
          successMessage={t.toast.discountSaved}
          onDone={close}
          onCancel={close}
        >
          {(fieldErrors) => (
            <>
              <input type="hidden" name="id" value={user.id} />
              <TextField
                name="discountPercent"
                label={t.discount.field}
                type="number"
                step="0.01"
                defaultValue={user.discountPercent}
                required
                error={fieldErrors.discountPercent}
              />
            </>
          )}
        </UserActionForm>
      </UserDialog>

      <UserDialog
        open={dialog === "status"}
        onOpenChange={(open) => (open ? setDialog("status") : close())}
        title={suspended ? t.actions.activate : t.actions.suspend}
        description={suspended ? t.bulk.confirmActivate : t.bulk.confirmSuspend}
      >
        <UserActionForm
          action={setUserStatusAction}
          submitLabel={suspended ? t.actions.activate : t.actions.suspend}
          destructive={!suspended}
          successMessage={t.toast.statusChanged}
          onDone={close}
          onCancel={close}
        >
          <input type="hidden" name="id" value={user.id} />
          <input type="hidden" name="status" value={suspended ? "ACTIVE" : "SUSPENDED"} />
          <p className="text-sm">
            <span className="font-medium">{user.username}</span>{" "}
            <span className="text-muted-foreground">({user.email})</span>
          </p>
        </UserActionForm>
      </UserDialog>

      <UserDialog
        open={dialog === "loginAs"}
        onOpenChange={(open) => (open ? setDialog("loginAs") : close())}
        title={`${t.actions.loginAs} · ${user.username}`}
        description={t.impersonate.confirm}
      >
        <UserActionForm
          action={loginAsUserAction}
          submitLabel={t.impersonate.submit}
          onDone={close}
          onCancel={close}
        >
          <input type="hidden" name="id" value={user.id} />
        </UserActionForm>
      </UserDialog>
    </>
  );
}

export default UsersRowActions;
