"use client";

import { toastApiError } from "@/lib/toast-api-error";
import * as React from "react";
import { Trash2 } from "lucide-react";
import { useRouter } from "next/navigation";
import { toast } from "sonner";

import {
  AlertDialog,
  AlertDialogCancel,
  AlertDialogContent,
  AlertDialogDescription,
  AlertDialogFooter,
  AlertDialogHeader,
  AlertDialogTitle,
  AlertDialogTrigger,
} from "@/components/ui/alert-dialog";
import { Button } from "@/components/ui/button";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { requestDashboardDelete } from "@/lib/dashboard-mutations.client";

type DashboardDeleteActionProps = {
  deleteUrl: string;
  entityId: number;
  fallbackError: string;
  defaultSuccessMessage: string;
  dialogTitle: string;
  dialogDescription: React.ReactNode;
  confirmLabel: string;
  deletingLabel?: string;
  deleteAriaLabel: string;
  deleteTooltip?: string;
  onDeleted?: () => void;
};

export function DashboardDeleteAction({
  deleteUrl,
  entityId,
  fallbackError,
  defaultSuccessMessage,
  dialogTitle,
  dialogDescription,
  confirmLabel,
  deletingLabel = "Deleting...",
  deleteAriaLabel,
  deleteTooltip = "Delete",
  onDeleted,
}: DashboardDeleteActionProps) {
  const router = useRouter();
  const [open, setOpen] = React.useState(false);
  const [isDeleting, setIsDeleting] = React.useState(false);

  async function handleDelete() {
    setIsDeleting(true);

    try {
      const message = await requestDashboardDelete(deleteUrl, entityId, fallbackError);
      toast.success(message || defaultSuccessMessage);
      setOpen(false);
      onDeleted?.();
      router.refresh();
    } catch (error) {
      toastApiError(error, fallbackError);
    } finally {
      setIsDeleting(false);
    }
  }

  return (
    <AlertDialog open={open} onOpenChange={setOpen}>
      <Tooltip>
        <TooltipTrigger asChild>
          <AlertDialogTrigger asChild>
            <Button
              type="button"
              variant="destructive"
              size="icon-sm"
              className="size-7"
              aria-label={deleteAriaLabel}
            >
              <Trash2 className="size-3.5" />
            </Button>
          </AlertDialogTrigger>
        </TooltipTrigger>
        <TooltipContent>{deleteTooltip}</TooltipContent>
      </Tooltip>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>{dialogTitle}</AlertDialogTitle>
          <AlertDialogDescription>{dialogDescription}</AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>
          <Button
            type="button"
            variant="destructive"
            disabled={isDeleting}
            onClick={handleDelete}
          >
            {isDeleting ? deletingLabel : confirmLabel}
          </Button>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );
}
