// Verificacion de la MEDICION de la landing contra la BD viva (nube).
// Env: SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_KEY.
import { createClient } from '@supabase/supabase-js';

const URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
const ANON = process.env.SUPABASE_ANON_KEY || process.env.VITE_SUPABASE_ANON_KEY;
const SERVICE = process.env.SUPABASE_SERVICE_KEY;
if (!URL || !ANON || !SERVICE) {
  console.log('Faltan SUPABASE_URL / SUPABASE_ANON_KEY / SUPABASE_SERVICE_KEY');
  process.exit(1);
}

let fallos = 0;
const check = (cond, msg) => {
  console.log((cond ? '  OK  ' : '  XX  ') + msg);
  if (!cond) fallos++;
};
const anon = createClient(URL, ANON, { auth: { persistSession: false } });
const svc = createClient(URL, SERVICE, { auth: { persistSession: false } });
const SESION = crypto.randomUUID();

try {
  // 1) Anon inserta una visita (lo que hace la landing)
  const { error: e1 } = await anon.from('eventos_web').insert({ evento: 'visita', pantalla: 'test', sesion: SESION, utm_source: 'test-medicion' });
  check(!e1, 'Anon registra visita' + (e1 ? ' -> ' + e1.message : ''));

  // 2) Tambien via sendBeacon-style (apikey en la URL, sin headers de auth)
  const res = await fetch(`${URL}/rest/v1/eventos_web?apikey=${ANON}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ evento: 'click_demo', pantalla: 'test', sesion: SESION }),
  });
  check(res.status === 201, `Insert estilo sendBeacon (apikey en URL) -> HTTP ${res.status}`);

  // 3) Evento fuera de la lista blanca -> rechazado
  const { error: e3 } = await anon.from('eventos_web').insert({ evento: 'hackeo', sesion: SESION });
  check(!!e3, 'Evento invalido RECHAZADO (' + (e3?.message ?? 'sin error!').slice(0, 60) + ')');

  // 4) Anon NO puede leer los eventos
  const { data: d4 } = await anon.from('eventos_web').select('id').limit(5);
  check((d4?.length ?? 0) === 0, 'Anon NO puede leer eventos');

  // 5) Anon NO puede ver el embudo
  const { error: e5 } = await anon.rpc('ceo_embudo_web', { p_dias: 7 });
  check(!!e5, 'Embudo bloqueado sin ser fundador (' + (e5?.message ?? 'sin error!').slice(0, 50) + ')');

  // 6) El embudo cuenta bien (validado con service directo sobre la tabla)
  const { data: d6 } = await svc.from('eventos_web').select('id').eq('sesion', SESION);
  check((d6?.length ?? 0) === 2, `Quedaron registrados los 2 eventos de prueba (${d6?.length})`);

  // 7) La tienda demo esta lista para recibir curiosos
  const { data: demo } = await anon.from('restaurantes').select('nombre, abierto, publicado, en_directorio').eq('slug', 'demo-gustito').maybeSingle();
  check(!!demo && demo.abierto && demo.publicado, 'Tienda demo publicada y abierta: ' + demo?.nombre);
  check(demo?.en_directorio === false, 'Tienda demo FUERA del directorio (solo por enlace)');
  const { data: prods } = await anon.from('productos').select('id').eq('restaurante_id', (await svc.from('restaurantes').select('id').eq('slug', 'demo-gustito').maybeSingle()).data.id).eq('disponible', true);
  check((prods?.length ?? 0) >= 10, `Menu demo con ${prods?.length} productos visibles`);
} catch (e) {
  console.log('  XX  Excepción: ' + e.message);
  fallos++;
} finally {
  await svc.from('eventos_web').delete().eq('sesion', SESION);
  console.log('\nLimpieza hecha (eventos de prueba fuera)');
}

console.log(fallos === 0 ? '\nMEDICION OK' : `\nMEDICION: ${fallos} FALLO(S)`);
process.exit(fallos === 0 ? 0 : 1);
