// PRUEBA EN VIVO DEL SELLO DE COMPROBACION (2026-07-28)
// Siembra un documento real, escanea el "sello" como lo haria un cliente con su
// telefono (o un fiscal meses despues) y comprueba que la pagina publicada
// responda bien y NO destape lo que consumio la gente. Limpia todo al final.
import { readFileSync } from 'node:fs';

const REF = 'szzhhlevtrcambcoytiz';
const PAT = readFileSync(new URL('../.sb_token', import.meta.url), 'utf8').trim();
const SELLO = process.env.SELLO ?? 'https://gustito-sello.pages.dev';

let fallos = 0;
const check = (cond, msg) => {
  console.log((cond ? '  OK  ' : '  XX  ') + msg);
  if (!cond) fallos++;
};

async function sql(query) {
  const r = await fetch(`https://api.supabase.com/v1/projects/${REF}/database/query`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${PAT}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ query }),
  });
  const t = await r.text();
  if (!r.ok) throw new Error(t.slice(0, 200));
  return JSON.parse(t);
}

// RIF DE PRUEBAS, JAMAS el de un cliente real de la imprenta: la limpieza de
// este test borra el emisor COMPLETO. El 2026-07-31 una corrida con
// J-50856106-6 (ya dado de alta real como EF-00006-0) barrio el alta del
// piloto: llaves, respaldo del libro y estacion. Ademas, limpiar() ahora
// ABORTA si el RIF tiene libro respaldado en la nube.
const RIF = 'V-22606827-5';
const lit = (s) => `'${String(s).replace(/'/g, "''")}'`;
const limpiar = async () => {
  const real = await sql(`select count(*)::int as n from fiscal.respaldo r join fiscal.emisores e on e.id = r.emisor_id where e.rif = ${lit(RIF)}`);
  if (real[0]?.n > 0) throw new Error(`FRENO: el emisor ${RIF} tiene ${real[0].n} lineas de libro respaldadas: es un cliente REAL, este test no lo toca`);
  return sql(`delete from fiscal.consultas_qr where token in (select token from fiscal.documentos d join fiscal.emisores e on e.id=d.emisor_id where e.rif=${lit(RIF)});
       delete from fiscal.documentos where emisor_id in (select id from fiscal.emisores where rif=${lit(RIF)});
       delete from fiscal.series where emisor_id in (select id from fiscal.emisores where rif=${lit(RIF)});
       delete from fiscal.emisores where rif=${lit(RIF)};`);
};

try {
  await limpiar();
  await sql(`insert into fiscal.emisores (rif, razon_social, domicilio_fiscal, llave_hash)
             values (${lit(RIF)}, 'Arepa Power Restaurant', 'Araure, Portuguesa', 'llave')`);
  const doc = (await sql(`select * from fiscal.recibir_documento(${lit(RIF)}, 'A', 'factura', 1, 'hash-sello-vivo',
    now(), 1000.00, 160.00, 1160.00,
    '{"cliente":{"nombre":"Maria Rodriguez","cedula":"V-22606827"},"renglones":[{"nombre":"Arepa Domino"}]}'::jsonb)`))[0];
  const url = `${SELLO}/v/${doc.token}`;
  console.log(`\nSello de prueba: ${url}\n`);

  console.log('== 1. El cliente escanea y ve su comprobacion ==');
  const r = await fetch(url);
  const html = await r.text();
  check(r.status === 200, `la pagina responde (HTTP ${r.status})`);
  check(/Documento comprobado/i.test(html), 'dice que el documento fue comprobado');
  check(html.includes('Arepa Power Restaurant') && html.includes(RIF), 'con el nombre y el RIF de quien lo emitio');
  check(/Número de control/i.test(html) && html.includes('>1<'), 'y su numero de control');
  check(/1\.160,00|1160/.test(html), 'y el monto en bolivares');

  console.log('\n== 2. NO destapa lo que consumio el cliente ==');
  check(!html.includes('Maria Rodriguez'), 'el nombre del cliente NO aparece');
  check(!html.includes('22606827'), 'ni su cedula');
  check(!html.includes('Arepa Domino'), 'ni lo que se comio');
  check(/no se muestra el detalle/i.test(html), 'y se lo explica al cliente en la misma pagina');

  console.log('\n== 3. Un sello inventado no comprueba nada ==');
  const falso = await fetch(`${SELLO}/v/${'a'.repeat(32)}`);
  check(falso.status === 404, `responde que no aparece (HTTP ${falso.status})`);
  const chatarra = await fetch(`${SELLO}/v/esto-no-es-un-token`);
  check(chatarra.status === 404, 'y un codigo con mala forma ni siquiera llega a consultar');

  console.log('\n== 4. La pagina se comporta como debe ==');
  check((r.headers.get('cache-control') ?? '').includes('no-store'), 'no se guarda en cache');
  check((r.headers.get('x-content-type-options') ?? '') === 'nosniff', 'con sus cabeceras de seguridad');
  check(/noindex/i.test(html), 'y no la indexan los buscadores');

  console.log('\n== 5. Queda el rastro del escaneo ==');
  const n = (await sql(`select count(*)::int as n from fiscal.consultas_qr where token=${lit(doc.token)}`))[0].n;
  check(n >= 1, `el escaneo quedo registrado (${n})`);
} catch (e) {
  console.log('  XX  ' + String(e).slice(0, 200));
  fallos++;
} finally {
  await limpiar();
}

console.log(fallos === 0 ? '\nSELLO EN VIVO: TODO VERDE' : `\n${fallos} FALLO(S)`);
process.exit(fallos === 0 ? 0 : 1);
