"use client";

import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { toast } from "sonner";
import { Eye, Download, Loader2 } from "lucide-react";

import { adminApi } from "@/lib/api/client";

const reasonSchema = z.object({
  reason: z
    .string()
    .trim()
    .min(1, "Reason is required")
    .min(10, "Reason must be at least 10 characters")
    .max(500, "Reason must be 500 characters or fewer"),
});

type ReasonForm = z.infer<typeof reasonSchema>;

export interface AdminManuscriptAccessModalProps {
  open: boolean;
  onClose: () => void;
  paperId: string | null;
  paperReferenceNo: string | null;
  action: "preview" | "download" | null;
}

export function AdminManuscriptAccessModal({
  open,
  onClose,
  paperId,
  paperReferenceNo,
  action,
}: AdminManuscriptAccessModalProps) {
  const [loading, setLoading] = useState(false);

  const {
    register,
    handleSubmit,
    reset,
    formState: { errors },
  } = useForm<ReasonForm>({
    resolver: zodResolver(reasonSchema),
    defaultValues: { reason: "" },
  });

  useEffect(() => {
    if (open) {
      reset({ reason: "" });
    }
  }, [open, reset]);

  if (!open || !paperId || !action) return null;

  function extractErrorMessage(e: unknown): string {
    const resp = (e as { response?: { data?: { code?: string; message?: string } } })
      ?.response;
    const code = resp?.data?.code;
    const message = resp?.data?.message;
    if (code && message) return `${code}: ${message}`;
    if (message) return message;
    return (e as { message?: string })?.message ?? "An unexpected error occurred";
  }

  async function onSubmit(data: ReasonForm) {
    if (!paperId || !action) return;
    setLoading(true);
    try {
      if (action === "preview") {
        const res = await adminApi.getManuscriptPreview(paperId, data.reason);
        const url = URL.createObjectURL(res.data);
        window.open(url, "_blank");
        setTimeout(() => URL.revokeObjectURL(url), 60000);
      } else {
        const res = await adminApi.downloadManuscript(paperId, data.reason);
        const blob = res.data;
        const disposition = res.headers?.["content-disposition"] ?? "";
        const filenameMatch = disposition.match(/filename="?([^";\n]+)"?/);
        const filename = filenameMatch?.[1] ?? `admin-${paperReferenceNo ?? "manuscript"}.pdf`;
        const url = URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
      }
      onClose();
    } catch (e) {
      toast.error(extractErrorMessage(e));
    } finally {
      setLoading(false);
    }
  }

  const isPreview = action === "preview";

  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
      <div className="w-full max-w-md bg-white rounded-xl shadow-xl p-6">
        <h3 className="text-lg font-semibold text-gray-900 mb-1">
          {isPreview ? "Preview Manuscript" : "Download Manuscript"}
        </h3>
        <p className="text-sm text-gray-500 mb-4">
          Admin manuscript access is audited. Please provide a reason for this access.
        </p>

        <form onSubmit={handleSubmit(onSubmit)}>
          <label className="block text-sm font-medium text-gray-700 mb-1">
            Reason for access
          </label>
          <textarea
            rows={3}
            className="w-full rounded-md border border-gray-300 px-3 py-2 text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 mb-1"
            placeholder="e.g., Reviewing plagiarism report for this submission"
            disabled={loading}
            {...register("reason")}
          />
          {errors.reason ? (
            <p className="text-xs text-red-600 mb-3">{errors.reason.message}</p>
          ) : (
            <div className="mb-3" />
          )}

          <div className="flex justify-end gap-2">
            <button
              type="button"
              onClick={onClose}
              disabled={loading}
              className="rounded-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition disabled:opacity-50"
            >
              Cancel
            </button>
            <button
              type="submit"
              disabled={loading}
              className="inline-flex items-center gap-1.5 rounded-md bg-indigo-600 px-4 py-2 text-sm font-semibold text-white shadow hover:bg-indigo-700 disabled:opacity-50 transition"
            >
              {loading ? (
                <Loader2 className="h-4 w-4 animate-spin" aria-hidden="true" />
              ) : isPreview ? (
                <Eye className="h-4 w-4" aria-hidden="true" />
              ) : (
                <Download className="h-4 w-4" aria-hidden="true" />
              )}
              {isPreview ? "Preview" : "Download"}
            </button>
          </div>
        </form>
      </div>
    </div>
  );
}

export default AdminManuscriptAccessModal;
