/* Capa única de red para casamia.ec.
   Pon API.base con la URL del worker (ej. https://api.casamia.ec o
   https://casamia-api.<subdominio>.workers.dev) y todos los formularios y CTA
   del sitio empiezan a enviar. El worker es el que habla con Resend.

   Rutas que consume:
     POST /contacto  → mensaje del formulario de contacto
     POST /lead      → interés en una propiedad (clic en Agendar visita / Llamar)
     POST /me/anuncio→ alta de propiedad desde el formulario de publicación

   Si un envío falla (worker caído, sin internet), queda en una cola en
   localStorage y se reintenta en la siguiente carga de página, así no se
   pierde ningún lead. */
const API = {
  base: '',
  routes: { contacto: '/contacto', lead: '/lead', anuncio: '/me/anuncio' },
  timeout: 12000,
  cola: 'casamia:cola',

  async post(route, body, { queue = true } = {}) {
    const payload = { ...body, pagina: location.href, referrer: document.referrer || null, enviado: new Date().toISOString() };
    if (!API.base) { await new Promise(r => setTimeout(r, 600)); return { ok: true, stub: true }; }
    const ctrl = new AbortController();
    const t = setTimeout(() => ctrl.abort(), API.timeout);
    try {
      const r = await fetch(API.base + (API.routes[route] || route), {
        method: 'POST', credentials: 'include', signal: ctrl.signal,
        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
        body: JSON.stringify(payload)
      });
      const j = await r.json().catch(() => ({}));
      if (!r.ok) throw new Error(j.error || 'No pudimos enviar tu mensaje. Intenta de nuevo.');
      return j;
    } catch (e) {
      if (queue) API.encolar(route, payload);
      throw e.name === 'AbortError' ? new Error('La conexión tardó demasiado. Intenta de nuevo.') : e;
    } finally { clearTimeout(t); }
  },

  /* Los leads no deben bloquear la UI: se envían en segundo plano y, si fallan,
     quedan en la cola. sendBeacon sobrevive a la salida hacia WhatsApp. */
  lead(body) {
    const payload = { ...body, pagina: location.href, referrer: document.referrer || null, enviado: new Date().toISOString() };
    if (!API.base) return;
    const url = API.base + API.routes.lead;
    try {
      const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });
      if (navigator.sendBeacon && navigator.sendBeacon(url, blob)) return;
    } catch (e) {}
    fetch(url, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) })
      .catch(() => API.encolar('lead', payload));
  },

  encolar(route, payload) {
    try {
      const q = JSON.parse(localStorage.getItem(API.cola) || '[]');
      q.push({ route, payload });
      localStorage.setItem(API.cola, JSON.stringify(q.slice(-30)));
    } catch (e) {}
  },
  async vaciarCola() {
    if (!API.base) return;
    let q = [];
    try { q = JSON.parse(localStorage.getItem(API.cola) || '[]'); } catch (e) { return; }
    if (!q.length) return;
    const quedan = [];
    for (const item of q) {
      try {
        const r = await fetch(API.base + (API.routes[item.route] || item.route), {
          method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(item.payload)
        });
        if (!r.ok) quedan.push(item);
      } catch (e) { quedan.push(item); }
    }
    try { localStorage.setItem(API.cola, JSON.stringify(quedan)); } catch (e) {}
  }
};
/* Babel ejecuta este archivo después del evento load, así que no se puede
   gatillar ahí: se vacía la cola en cuanto el módulo corre. */
if (typeof window !== 'undefined') {
  if (document.readyState === 'complete') setTimeout(() => API.vaciarCola(), 0);
  else window.addEventListener('load', () => API.vaciarCola(), { once: true });
}
Object.assign(window, { API });
