// Medicion propia de la landing: eventos anonimos (sin datos personales)
// a la tabla eventos_web. Nadie puede leerlos por la API; el embudo lo ve
// el fundador en su panel. La medicion JAMAS puede romper la pagina:
// todo va envuelto en try/catch y es "dispara y olvida".

const URL = import.meta.env.VITE_SUPABASE_URL as string;
const ANON = import.meta.env.VITE_SUPABASE_ANON_KEY as string;

export type EventoWeb =
  | 'visita'
  | 'click_registro'
  | 'click_entrar'
  | 'click_vitrina'
  | 'click_whatsapp'
  | 'click_demo'
  | 'cuenta_creada';

function sesion(): string | null {
  try {
    let s = sessionStorage.getItem('gx_sesion');
    if (!s) {
      s = crypto.randomUUID();
      sessionStorage.setItem('gx_sesion', s);
    }
    return s;
  } catch {
    return null;
  }
}

export function medir(evento: EventoWeb, pantalla = 'landing'): void {
  try {
    if (!URL || !ANON) return;
    const q = new URLSearchParams(window.location.search);
    const body = JSON.stringify({
      p_evento: evento,
      p_pantalla: pantalla,
      p_sesion: sesion(),
      p_origen: (document.referrer || '').slice(0, 180) || null,
      p_utm_source: q.get('utm_source'),
      p_utm_medium: q.get('utm_medium'),
      p_utm_campaign: q.get('utm_campaign'),
    });
    // OJO: NO usar sendBeacon aqui. Con Blob application/json a otro dominio,
    // Chrome devuelve true ("lo mande") y despues BOTA la peticion en silencio
    // (preflight CORS que el beacon no completa) — comprobado en vivo 2026-07-26:
    // 2 beacons "true" y 0 filas en la BD. fetch con keepalive:true es la via
    // correcta: sobrevive la navegacion igual que un beacon y SI llega (201).
    //
    // Se llama a una PUERTA (fn_medir), no a la tabla. La tabla no acepta
    // escritura de nadie de afuera: la puerta valida el evento, recorta los
    // textos y frena a quien insista. Auditoria 2026-07-30, hallazgo 1.
    const destino = `${URL}/rest/v1/rpc/fn_medir?apikey=${ANON}`;
    fetch(destino, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body, keepalive: true }).catch(() => {});
  } catch {
    /* nunca romper la pagina por medir */
  }
}

// Una visita por sesion del navegador (no por cada recarga).
export function medirVisita(): void {
  try {
    if (sessionStorage.getItem('gx_visita')) return;
    sessionStorage.setItem('gx_visita', '1');
  } catch {
    /* sin sessionStorage: medimos igual */
  }
  medir('visita');
}
