import { ocrReceipt } from "../mistral";
import { sendText, sendButtons, sendPresence, downloadMediaAsBase64, uploadMedia } from "../evolution";
import { setSession } from "../sessions";

export async function handleImageMessage(
  groupJid: string,
  senderPhone: string,
  senderName: string,
  messageData: object,
  mimeType = "image/jpeg"
) {
  const base64 = await downloadMediaAsBase64(messageData);
  if (!base64) {
    await sendText(groupJid, "No pude descargar el archivo desde WhatsApp. Reenviamelo por favor.");
    return;
  }

  await sendText(groupJid, mimeType === "application/pdf" ? "Procesando PDF..." : "Procesando imagen...");

  let presenceInterval: ReturnType<typeof setInterval> | null = null;
  try {
    await sendPresence(groupJid, "composing");
    presenceInterval = setInterval(() => {
      void sendPresence(groupJid, "composing");
    }, 4000);

    // Upload to Oracle VM for archival (fire and forget — don't block OCR)
    const imageUrlPromise = uploadMedia(base64, mimeType);

    // Run OCR
    const ocr = await ocrReceipt(base64, mimeType);

    // Build preview text
    const preview: string[] = ["Comprobante detectado"];
    if (ocr.amount) preview.push(`Monto: $${ocr.amount.toLocaleString("es-AR")}`);
    if (ocr.date) preview.push(`Fecha: ${ocr.date}`);
    if (ocr.bank) preview.push(`Banco: ${ocr.bank}`);
    if (ocr.reference) preview.push(`Referencia: ${ocr.reference}`);

    if (preview.length === 1) {
      await sendText(
        groupJid,
        "No pude leer el comprobante claramente. Si querés, reenviamelo en mejor calidad o registralo por texto con BOT registrar pago ..."
      );
      return;
    }

    // Wait for upload URL (usually already done by now)
    const imageUrl = await imageUrlPromise;

    // Save state — store URL instead of base64 to keep Supabase clean
    await setSession(senderPhone, "awaiting_payment_type", {
      ocrData: ocr,
      imageUrl,
      senderName,
    });

    await sendButtons(
      groupJid,
      preview.join("\n"),
      `¿${senderName}, querés registrar este comprobante?`,
      [
        { id: "confirm_yes", text: "✅ Sí, registrar" },
        { id: "confirm_no", text: "❌ No, ignorar" },
      ]
    );
  } finally {
    if (presenceInterval) clearInterval(presenceInterval);
    await sendPresence(groupJid, "paused");
  }
}
