import { useEffect, useState } from "react";
import { toast } from "sonner";
import { Download, Eye, Mail, MessageCircle, Printer, Save, Share2 } from "lucide-react";
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import {
  downloadBlob,
  printBlob,
  reportMessage,
  shareEmail,
  shareNative,
  shareWhatsApp,
} from "@/lib/report-actions";

type Props = {
  blob: Blob | null;
  fileName: string;
  reportNo: string;
  verdict: string;
  /** Rebuilds the PDF from the LIVE form state right before download/print/share. */
  getBlob?: () => Promise<Blob | null>;
  onSave?: () => Promise<void> | void;
  saveLabel?: string;
};

const btn =
  "flex items-center justify-center gap-2 rounded-2xl border border-border bg-background py-3 text-xs font-semibold disabled:opacity-50";

export function ReportActions({
  blob,
  fileName,
  reportNo,
  verdict,
  getBlob,
  onSave,
  saveLabel = "Save to my history",
}: Props) {
  const [saving, setSaving] = useState(false);
  const [working, setWorking] = useState(false);
  const [previewUrl, setPreviewUrl] = useState<string | null>(null);
  const [previewBlob, setPreviewBlob] = useState<Blob | null>(null);
  const text = reportMessage(reportNo, verdict);
  const ready = Boolean(blob) || Boolean(getBlob);

  useEffect(() => {
    return () => {
      if (previewUrl) URL.revokeObjectURL(previewUrl);
    };
  }, [previewUrl]);

  /** Always regenerate from live state so the PDF is never blank or stale. */
  async function resolveBlob() {
    if (!getBlob) return blob;
    setWorking(true);
    try {
      const fresh = await getBlob();
      if (fresh) return fresh;
      if (blob) return blob;
      toast.error("The report could not be generated — please re-run the analysis.");
      return null;
    } catch (error) {
      if (blob) return blob;
      toast.error(
        error instanceof Error ? `Report generation failed: ${error.message}` : "The report could not be generated.",
      );
      return null;
    } finally {
      setWorking(false);
    }
  }

  async function save() {
    if (!onSave) return;
    setSaving(true);
    try {
      await onSave();
    } finally {
      setSaving(false);
    }
  }

  return (
    <>
    <div className="mt-4 grid grid-cols-2 gap-2">
      <button
        disabled={!ready || working}
        onClick={async () => {
          const b = await resolveBlob();
          if (!b) return;
          if (previewUrl) URL.revokeObjectURL(previewUrl);
          setPreviewBlob(b);
          setPreviewUrl(URL.createObjectURL(b));
        }}
        className={`${btn} col-span-2 border-transparent bg-accent text-accent-foreground`}
      >
        <Eye className="h-4 w-4" /> {working ? "Preparing…" : "Preview report"}
      </button>
      <button
        disabled={!ready || working}
        onClick={async () => {
          const b = await resolveBlob();
          if (!b) return;
          downloadBlob(b, fileName);
        }}
        className={btn}
      >
        <Download className="h-4 w-4" /> {working ? "Preparing…" : "Download PDF"}
      </button>
      <button
        disabled={!ready || working}
        onClick={async () => {
          const b = await resolveBlob();
          if (!b) return;
          printBlob(b);
        }}
        className={btn}
      >
        <Printer className="h-4 w-4" /> Print report
      </button>
      <button onClick={() => shareWhatsApp(text)} className={btn}>
        <MessageCircle className="h-4 w-4" /> WhatsApp
      </button>
      <button onClick={() => shareEmail(`Mold inspection report ${reportNo}`, text)} className={btn}>
        <Mail className="h-4 w-4" /> Email
      </button>
      <button
        disabled={!ready || working}
        onClick={async () => {
          const b = await resolveBlob();
          if (!b) return;
          const ok = await shareNative(b, fileName, text);
          if (!ok) {
            await navigator.clipboard.writeText(text);
            toast.success("Report summary copied to clipboard.");
          }
        }}
        className={btn}
      >
        <Share2 className="h-4 w-4" /> Share file
      </button>
      {onSave ? (
        <button disabled={saving} onClick={save} className={`${btn} border-transparent bg-brand text-primary-foreground`}>
          <Save className="h-4 w-4" /> {saving ? "Saving…" : saveLabel}
        </button>
      ) : null}
    </div>

    <Dialog
      open={Boolean(previewUrl)}
      onOpenChange={(open) => {
        if (!open) {
          if (previewUrl) URL.revokeObjectURL(previewUrl);
          setPreviewUrl(null);
          setPreviewBlob(null);
        }
      }}
    >
      <DialogContent className="flex h-[90vh] w-[96vw] max-w-3xl flex-col gap-3 p-4">
        <DialogHeader>
          <DialogTitle className="text-base">Report preview — {reportNo}</DialogTitle>
        </DialogHeader>
        {previewUrl ? (
          <iframe
            src={previewUrl}
            title={`Inspection report ${reportNo}`}
            className="min-h-0 flex-1 w-full rounded-xl border border-border bg-muted"
          />
        ) : null}
        <div className="grid grid-cols-2 gap-2">
          <button onClick={() => previewBlob && downloadBlob(previewBlob, fileName)} className={btn}>
            <Download className="h-4 w-4" /> Download PDF
          </button>
          <button onClick={() => previewBlob && printBlob(previewBlob)} className={btn}>
            <Printer className="h-4 w-4" /> Print report
          </button>
        </div>
      </DialogContent>
    </Dialog>
    </>
  );
}