"use client";

import { useState } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { Loader2 } from "lucide-react";
import { Button } from "@/components/ui/button";
import { ConfirmDialog } from "@/components/ui/confirm-dialog";
import { useLocale } from "@/components/providers/locale-provider";
import { StatusToast } from "@/components/ui/status-toast";

type SequenceStatus = "draft" | "active" | "paused" | "completed" | "archived";
type ActionKey = "" | "activate" | "pause" | "resume" | "archive" | "generate";
type ConfirmKind = "" | "archive";

function canActivate(status: SequenceStatus) {
  return status === "draft" || status === "paused";
}

function canPause(status: SequenceStatus) {
  return status === "active";
}

function canResume(status: SequenceStatus) {
  return status === "paused";
}

function canArchive(status: SequenceStatus) {
  return status !== "archived";
}

export function SequenceActions({
  sequenceId,
  status,
}: {
  sequenceId: string;
  status: SequenceStatus;
}) {
  const router = useRouter();
  const { locale } = useLocale();
  const isAr = locale === "ar";
  const [loading, setLoading] = useState<ActionKey>("");
  const [confirm, setConfirm] = useState<ConfirmKind>("");
  const [result, setResult] = useState<string | null>(null);
  const [toast, setToast] = useState<{ message: string; variant: "success" | "error" } | null>(
    null
  );

  async function runAction(
    key: Exclude<ActionKey, "">,
    url: string,
    successMessage: string,
    method: "PATCH" | "POST" = "POST",
    redirectTo?: string
  ) {
    if (loading) return;
    setLoading(key);
    setResult(null);
    const res = await fetch(url, { method });
    const json = await res.json().catch(() => ({}));
    setLoading("");
    setConfirm("");

    if (!res.ok) {
      const msg =
        (json as { error?: string }).error ?? (isAr ? "فشلت العملية" : "Action failed");
      setResult(msg);
      setToast({ message: msg, variant: "error" });
      return;
    }

    setToast({ message: successMessage, variant: "success" });
    if (redirectTo) {
      router.push(redirectTo);
      return;
    }
    router.refresh();
  }

  async function generateRecipients() {
    if (loading) return;
    setLoading("generate");
    setResult(null);
    const res = await fetch(`/api/sequences/${sequenceId}/generate-recipients`, {
      method: "POST",
    });
    const json = await res.json().catch(() => ({}));
    setLoading("");
    if (!res.ok) {
      const msg =
        (json as { error?: string }).error ??
        (isAr ? "فشل توليد المستلمين" : "Failed to generate recipients");
      setResult(msg);
      setToast({ message: msg, variant: "error" });
      return;
    }
    const data = json as { enrolledRecipients?: number; validRecipients?: number };
    setResult(
      isAr
        ? `تم إدراج ${data.enrolledRecipients ?? 0} مستلم (من ${data.validRecipients ?? 0} صالح).`
        : `Enrolled ${data.enrolledRecipients ?? 0} recipients (${data.validRecipients ?? 0} eligible).`
    );
    setToast({
      message: isAr ? "تم توليد مستلمي السلسلة" : "Sequence recipients generated",
      variant: "success",
    });
    router.refresh();
  }

  const labels = {
    edit: isAr ? "تعديل" : "Edit",
    generate: isAr ? "توليد المستلمين" : "Generate recipients",
    activate: isAr ? "تفعيل" : "Activate",
    pause: isAr ? "إيقاف" : "Pause",
    resume: isAr ? "استئناف" : "Resume",
    archive: isAr ? "أرشفة" : "Archive",
    archiveTitle: isAr ? "أرشفة السلسلة" : "Archive sequence",
    archiveDesc: isAr
      ? "ستُخفى من القائمة النشطة مع الإبقاء على السجل."
      : "It will be hidden from the active list while keeping history.",
    archiveConfirm: isAr ? "أرشفة" : "Archive",
    activated: isAr ? "تم تفعيل السلسلة" : "Sequence activated",
    paused: isAr ? "تم إيقاف السلسلة" : "Sequence paused",
    resumed: isAr ? "تم استئناف السلسلة" : "Sequence resumed",
    archived: isAr ? "تمت أرشفة السلسلة" : "Sequence archived",
  };

  const busy = loading !== "";

  return (
    <>
      <StatusToast
        message={toast?.message ?? null}
        variant={toast?.variant}
        onDismiss={() => setToast(null)}
      />
      <ConfirmDialog
        open={confirm === "archive"}
        title={labels.archiveTitle}
        description={labels.archiveDesc}
        confirmLabel={labels.archiveConfirm}
        loading={loading === "archive"}
        onCancel={() => setConfirm("")}
        onConfirm={() =>
          void runAction(
            "archive",
            `/api/sequences/${sequenceId}/archive`,
            labels.archived,
            "PATCH",
            "/sequences"
          )
        }
      />

      <div className="space-y-3">
        <div className="flex flex-wrap gap-2">
          <Button asChild variant="outline" size="sm">
            <Link href={`/sequences/${sequenceId}/edit`}>{labels.edit}</Link>
          </Button>
          <Button
            type="button"
            variant="outline"
            size="sm"
            disabled={busy || status === "archived"}
            onClick={() => void generateRecipients()}
          >
            {loading === "generate" ? <Loader2 className="h-4 w-4 animate-spin" /> : null}
            {labels.generate}
          </Button>
          {canActivate(status) ? (
            <Button
              type="button"
              size="sm"
              disabled={busy}
              onClick={() =>
                void runAction(
                  "activate",
                  `/api/sequences/${sequenceId}/activate`,
                  labels.activated,
                  "PATCH"
                )
              }
            >
              {loading === "activate" ? <Loader2 className="h-4 w-4 animate-spin" /> : null}
              {labels.activate}
            </Button>
          ) : null}
          {canPause(status) ? (
            <Button
              type="button"
              variant="outline"
              size="sm"
              disabled={busy}
              onClick={() =>
                void runAction(
                  "pause",
                  `/api/sequences/${sequenceId}/pause`,
                  labels.paused,
                  "PATCH"
                )
              }
            >
              {loading === "pause" ? <Loader2 className="h-4 w-4 animate-spin" /> : null}
              {labels.pause}
            </Button>
          ) : null}
          {canResume(status) ? (
            <Button
              type="button"
              variant="outline"
              size="sm"
              disabled={busy}
              onClick={() =>
                void runAction(
                  "resume",
                  `/api/sequences/${sequenceId}/resume`,
                  labels.resumed,
                  "PATCH"
                )
              }
            >
              {loading === "resume" ? <Loader2 className="h-4 w-4 animate-spin" /> : null}
              {labels.resume}
            </Button>
          ) : null}
          {canArchive(status) ? (
            <Button type="button" variant="outline" size="sm" disabled={busy} onClick={() => setConfirm("archive")}>
              {loading === "archive" ? <Loader2 className="h-4 w-4 animate-spin" /> : null}
              {labels.archive}
            </Button>
          ) : null}
        </div>
        {result ? <p className="text-sm text-muted-foreground">{result}</p> : null}
      </div>
    </>
  );
}
