import logoUrl from "@/assets/logo.png";
import { supabase } from "@/integrations/supabase/client";
import { buildReportPdf } from "./report-pdf";
import { COMPANY } from "./company";
import type { ReportInput } from "./report-types";

const BUCKET = "inspection-reports";

export function makeReportNo(date = new Date()) {
  const stamp = date.toISOString().slice(0, 10).replace(/-/g, "");
  const rand = Math.random().toString(36).slice(2, 6).toUpperCase();
  return `EMS-${stamp}-${rand}`;
}

let cachedLogo: string | null | undefined;
export async function loadLogoDataUrl() {
  if (cachedLogo !== undefined) return cachedLogo;
  try {
    const res = await fetch(logoUrl);
    const blob = await res.blob();
    cachedLogo = await new Promise<string>((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => resolve(reader.result as string);
      reader.onerror = () => reject(new Error("logo"));
      reader.readAsDataURL(blob);
    });
  } catch {
    cachedLogo = null;
  }
  return cachedLogo;
}

export async function generateReport(input: ReportInput) {
  const logoDataUrl = input.logoDataUrl ?? (await loadLogoDataUrl());
  const blob = await buildReportPdf({ ...input, logoDataUrl });
  return { blob, fileName: `${input.reportNo}.pdf` };
}

/** Upload a generated PDF to private storage under the user's folder. */
export async function uploadReportPdf(blob: Blob, userId: string, reportNo: string) {
  const path = `${userId}/${reportNo}.pdf`;
  const { error } = await supabase.storage
    .from(BUCKET)
    .upload(path, blob, { contentType: "application/pdf", upsert: true });
  if (error) throw error;
  return path;
}

export async function reportPdfUrl(path?: string | null, expiresIn = 3600) {
  if (!path) return null;
  const { data } = await supabase.storage.from(BUCKET).createSignedUrl(path, expiresIn);
  return data?.signedUrl ?? null;
}

export function downloadBlob(blob: Blob, fileName: string) {
  const url = URL.createObjectURL(blob);
  const link = document.createElement("a");
  link.href = url;
  link.download = fileName;
  link.click();
  setTimeout(() => URL.revokeObjectURL(url), 4000);
}

export function printBlob(blob: Blob) {
  const url = URL.createObjectURL(blob);
  const win = window.open(url, "_blank");
  win?.addEventListener("load", () => win.print());
  setTimeout(() => URL.revokeObjectURL(url), 60000);
}

export function reportMessage(reportNo: string, verdict: string, link?: string | null) {
  return `${COMPANY.name} — AI Mold Inspection Report ${reportNo}: ${verdict}.${link ? ` View: ${link}` : ""}`;
}

export function shareWhatsApp(text: string) {
  window.open(`https://wa.me/?text=${encodeURIComponent(text)}`, "_blank", "noopener");
}

export function shareEmail(subject: string, body: string) {
  window.location.href = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
}

export async function shareNative(blob: Blob, fileName: string, text: string) {
  const file = new File([blob], fileName, { type: "application/pdf" });
  const nav = navigator as Navigator & { canShare?: (data: ShareData) => boolean };
  if (nav.share && nav.canShare?.({ files: [file] })) {
    await nav.share({ files: [file], title: fileName, text }).catch(() => undefined);
    return true;
  }
  return false;
}