// Golpes de seguridad contra lo que esta vivo: puerta del SENIAT, llaves
// ajenas, esquema fiscal, verificacion publica y freno del panel.
import fs from 'node:fs';
const cfg = JSON.parse(fs.readFileSync('C:/Users/10/Desktop/EstacionFiscal/fiscal.config.json', 'utf8'));
const SELLO = 'https://sello.gustitoxpress.app';
const EST = 'http://127.0.0.1:8739';
const env = fs.readFileSync('C:/Users/10/gustito-express/.env.production', 'utf8');
const URL_SB = env.match(/SUPABASE_URL\s*=\s*(\S+)/)?.[1];
const ANON = env.match(/ANON[A-Z_]*\s*=\s*(\S+)/)?.[1];

let ok = 0, mal = 0;
const check = (t, cond, extra = '') => { if (cond) { ok++; console.log('  ok  ' + t); } else { mal++; console.log('  MAL ' + t + (extra ? ' -> ' + extra : '')); } };

console.log('\n== la puerta del SENIAT ==');
let r = await fetch(`${EST}/fiscal`);
check('la pantalla del auditor responde', r.status === 200, 'HTTP ' + r.status);
r = await fetch(`${EST}/api/fiscal/eventos`);
check('sin clave NO entrega eventos', r.status === 401, 'HTTP ' + r.status);
r = await fetch(`${EST}/api/fiscal/eventos`, { headers: { Authorization: 'Bearer clave-inventada' } });
check('con clave inventada tampoco', r.status === 401, 'HTTP ' + r.status);

console.log('\n== la puerta de las maquinas (donde se escribe el libro) ==');
r = await fetch(`${EST}/api/venta`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' });
check('sin llave no se le mete nada al libro', r.status === 401, 'HTTP ' + r.status);
r = await fetch(`${EST}/api/venta`, {
  method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer efm_llave_de_otro' },
  body: JSON.stringify({ origen_id: 'x', total_usd: 1 }),
});
check('con llave ajena tampoco', r.status === 401, 'HTTP ' + r.status);

console.log('\n== la puerta de la imprenta en la nube ==');
r = await fetch(`${SELLO}/api/estacion`, {
  method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer gxf_' + 'a'.repeat(48) },
  body: JSON.stringify({ accion: 'pendientes', rif: cfg.emisor.rif, datos: {} }),
});
check('una llave inventada no saca las ventas de nadie', r.status >= 400, 'HTTP ' + r.status);
r = await fetch(`${SELLO}/api/estacion`, {
  method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + cfg.nube.llave },
  body: JSON.stringify({ accion: 'pendientes', rif: 'V-22606827-5', datos: {} }),
});
check('la llave buena NO sirve para el RIF de otro emisor', r.status >= 400, 'HTTP ' + r.status);

console.log('\n== el esquema fiscal no se asoma a internet ==');
for (const t of ['documentos', 'emisores', 'llaves', 'cola_gustito', 'operadores']) {
  const res = await fetch(`${URL_SB}/rest/v1/${t}?select=*&limit=1`, { headers: { apikey: ANON, Authorization: `Bearer ${ANON}` } });
  check(`fiscal.${t} no se puede leer desde afuera`, res.status >= 400, 'HTTP ' + res.status);
}

console.log('\n== verificacion publica del serial ==');
r = await fetch(`${SELLO}/verificar`);
check('la pagina de verificar existe', r.status === 200, 'HTTP ' + r.status);
// Asi se enumera de verdad: seriales DISTINTOS, uno tras otro.
let frenado = false, cuantos = 0;
for (let i = 1; i <= 40; i++) {
  const n = String(i).padStart(5, '0');
  const v = await fetch(`${SELLO}/api/verificar-estacion?serial=EF-${n}-0`);
  cuantos++;
  if (v.status === 429) { frenado = true; break; }
}
check('enumerar la cartera se frena', frenado, `aguanto ${cuantos} seriales distintos`);

console.log('\n== freno del panel de la imprenta ==');
let frenoPanel = false;
for (let i = 0; i < 25; i++) {
  const v = await fetch(`${SELLO}/api/admin`, {
    method: 'POST', headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ accion: 'entrar', datos: { usuario: 'zz_no_existe_' + i, clave: 'loquesea' } }),
  });
  if (v.status === 429) { frenoPanel = true; break; }
}
check('probar usuarios a lo loco se frena', frenoPanel);

console.log(`\n${ok} bien, ${mal} mal`);
