"use client";

import { useState } from "react";
import { toast } from "sonner";
import { Archive, RotateCcw, Loader2 } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
  Dialog,
  DialogClose,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog";
import { useArchiveCase, useRestoreCase, type ArchiveResult } from "@/lib/api/cases";

function paperclipMessage(res: ArchiveResult, action: "archive" | "restore"): string {
  const verb = action === "archive" ? "אורכן" : "שוחזר";
  switch (res.paperclip?.status) {
    case "archived": {
      const cancelled = res.paperclip.issues_cancelled?.length ?? 0;
      const issuesNote = cancelled > 0 ? ` (${cancelled} משימות פתוחות בוטלו)` : "";
      return `התיק ${verb}. גם הפרויקט ב-Paperclip${issuesNote}.`;
    }
    case "restored":
      return `התיק ${verb}. גם הפרויקט ב-Paperclip ${verb}.`;
    case "not_found":
      return `התיק ${verb}. לא נמצא פרויקט מקביל ב-Paperclip.`;
    case "error":
      return `התיק ${verb} ב-legal-ai, אך סנכרון Paperclip נכשל${
        res.paperclip?.message ? `: ${res.paperclip.message}` : "."
      }`;
    default:
      return `התיק ${verb}.`;
  }
}

export function CaseArchiveAction({
  caseNumber,
  archivedAt,
}: {
  caseNumber: string;
  archivedAt?: string | null;
}) {
  const [open, setOpen] = useState(false);
  const archive = useArchiveCase(caseNumber);
  const restore = useRestoreCase(caseNumber);

  const isArchived = Boolean(archivedAt);
  const pending = archive.isPending || restore.isPending;

  function handleArchive() {
    archive.mutate(undefined, {
      onSuccess: (res) => {
        setOpen(false);
        toast.success(paperclipMessage(res, "archive"));
      },
      onError: (err) =>
        toast.error(err instanceof Error ? err.message : "שגיאה בארכוב"),
    });
  }

  function handleRestore() {
    restore.mutate(undefined, {
      onSuccess: (res) => {
        toast.success(paperclipMessage(res, "restore"));
      },
      onError: (err) =>
        toast.error(err instanceof Error ? err.message : "שגיאה בשחזור"),
    });
  }

  if (isArchived) {
    return (
      <Button
        variant="outline"
        size="sm"
        disabled={pending}
        onClick={handleRestore}
      >
        {pending ? (
          <Loader2 className="me-1 h-3.5 w-3.5 animate-spin" />
        ) : (
          <RotateCcw className="me-1 h-3.5 w-3.5" />
        )}
        שחזר מהארכיון
      </Button>
    );
  }

  return (
    <Dialog open={open} onOpenChange={setOpen}>
      <DialogTrigger asChild>
        <Button variant="outline" size="sm" disabled={pending}>
          {pending ? (
            <Loader2 className="me-1 h-3.5 w-3.5 animate-spin" />
          ) : (
            <Archive className="me-1 h-3.5 w-3.5" />
          )}
          ארכן תיק
        </Button>
      </DialogTrigger>
      <DialogContent>
        <DialogHeader>
          <DialogTitle>ארכון תיק {caseNumber}</DialogTitle>
          <DialogDescription>
            התיק יוסר מרשימת התיקים הראשית ויעבור לעמוד הארכיון. הפרויקט
            המקביל ב-Paperclip יסומן גם הוא כארכוב. ניתן לשחזר בכל עת.
          </DialogDescription>
        </DialogHeader>
        <DialogFooter>
          <DialogClose asChild>
            <Button variant="outline">בטל</Button>
          </DialogClose>
          <Button onClick={handleArchive} disabled={pending}>
            {pending ? "מארכן..." : "ארכן"}
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
}
