// El canal de versiones NO puede ofrecer degradar.
//
// Paso de verdad en la laptop del piloto: el aviso decia "Hay una version nueva
// del cerebrito: 2.7.6 (tienes 2.8.0)" porque comparaba "distinta" en vez de
// "mas nueva". Con un version.json rezagado, eso invita a bajar de version.
//
// Correr: node test/test_actualizador.mjs   (desde apps/cerebrito, tras build)
import { createServer } from 'node:http';

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

// Servidor de mentira que hace de canal de versiones. Se levanta y se apunta la
// variable ANTES de cargar el modulo: la URL se resuelve al importarlo.
let queVersion = '0.0.0';
const srv = createServer((_req, res) => {
  res.writeHead(200, { 'content-type': 'application/json' });
  res.end(JSON.stringify({ version: queVersion, url: 'http://127.0.0.1:1/no-existe.exe' }));
});
await new Promise((r) => srv.listen(0, '127.0.0.1', r));
process.env.GX_URL_VERSION = `http://127.0.0.1:${srv.address().port}/version.json`;
const { crearActualizador, VERSION_CEREBRITO } = await import('../dist/actualizador.js');
queVersion = VERSION_CEREBRITO;

const dichos = [];
const act = crearActualizador({ base: process.cwd(), esExe: false, log: (m) => dichos.push(m) });

const revisar = async (v) => {
  queVersion = v;
  dichos.length = 0;
  await act.verificar();
  return { disponible: act.estado().disponible, avisos: dichos.filter((d) => /version nueva/i.test(d)) };
};

console.log(`\n== el canal de versiones (instalada: ${VERSION_CEREBRITO}) ==`);

const vieja = await revisar('2.7.6');
check('una version MAS VIEJA no se ofrece', vieja.disponible === null, `ofrecio ${vieja.disponible}`);
check('y no se avisa nada', vieja.avisos.length === 0, vieja.avisos.join(' | '));

const igual = await revisar(VERSION_CEREBRITO);
check('la misma version no se ofrece', igual.disponible === null);

const nueva = await revisar('9.9.9');
check('una version MAS NUEVA si se ofrece', nueva.disponible === '9.9.9');
check('y se avisa una sola vez', nueva.avisos.length === 1, nueva.avisos.join(' | '));

const parche = await revisar('2.8.10');
check('2.8.10 gana a 2.8.9 (compara numero a numero, no texto)', parche.disponible === '2.8.10');

act.detener();
srv.close();
console.log(`\n${ok} bien, ${mal} mal`);
process.exitCode = mal ? 1 : 0;
