// ============================================================
// reCAPTCHA v2 (checkbox) — always-visible widget
// ============================================================

declare const grecaptcha: {
  ready: (cb: () => void) => void;
  render: (container: string | HTMLElement, opts: { sitekey: string; callback: (token: string) => void; size?: string; theme?: string; badge?: string }) => number;
  reset: (widgetId: number) => void;
  getResponse: (widgetId: number) => string;
};

export const SITE_KEY = process.env.NEXT_PUBLIC_RECAPTCHA_V2_SITE_KEY || "6LcJIFMtAAAAAExxiUA45AZ0JdQi6ZDYSk1ltakt";
const SECRET = process.env.RECAPTCHA_V2_SECRET_KEY || "6LcJIFMtAAAAAIokN-PfrlLaJwXxG9ZzyTE1okVo";

// ── Server-side verification ───────────────────────────────

export async function verifyRecaptcha(token: string): Promise<boolean> {
  const res = await fetch("https://www.google.com/recaptcha/api/siteverify", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({ secret: SECRET, response: token }),
  });
  const data = (await res.json()) as { success: boolean };
  return data.success;
}

// ── Client-side: load reCAPTCHA API once ───────────────────

let recaptchaReady = false;
let recaptchaLoading: Promise<void> | null = null;

function loadRecaptcha(): Promise<void> {
  if (recaptchaReady) return Promise.resolve();
  if (recaptchaLoading) return recaptchaLoading;

  if (!SITE_KEY) {
    recaptchaReady = true;
    return Promise.resolve();
  }

  recaptchaLoading = new Promise<void>((resolve, reject) => {
    if (document.querySelector('script[src*="recaptcha/api.js"]')) {
      grecaptcha.ready(() => { recaptchaReady = true; resolve(); });
      return;
    }
    const s = document.createElement("script");
    s.src = "https://www.google.com/recaptcha/api.js";
    s.async = true;
    s.onload = () => { grecaptcha.ready(() => { recaptchaReady = true; resolve(); }); };
    s.onerror = () => reject(new Error("Failed to load reCAPTCHA"));
    document.body.appendChild(s);
  });
  return recaptchaLoading;
}

export async function renderWidget(containerId: string, callback: (token: string) => void): Promise<number | null> {
  if (!SITE_KEY) return null;
  const el = document.getElementById(containerId);
  if (!el) return null;
  await loadRecaptcha();
  // StrictMode double-mount guard: if already rendered, skip
  if (el.querySelector('iframe[src*="recaptcha"]')) return null;
  if (typeof grecaptcha === "undefined" || !grecaptcha.render) return null;
  try {
    const id = grecaptcha.render(containerId, { sitekey: SITE_KEY, callback, theme: "light" });
    return id;
  } catch {
    return null;
  }
}

export function resetWidget(widgetId: number): void {
  if (typeof grecaptcha !== "undefined") grecaptcha.reset(widgetId);
}

export function getWidgetResponse(widgetId: number): string {
  if (typeof grecaptcha === "undefined" || !grecaptcha.getResponse) return "";
  return grecaptcha.getResponse(widgetId);
}
