// GUARDIA DE PUERTOS para las suites: si en esta maquina ya hay un cerebrito
// corriendo (el de un negocio REAL, con autoarranque), sus puertos 8737/8738
// estan ocupados y la suite terminaria hablandole AL DE PRODUCCION (paso el
// 2026-07-25: la suite puso en mando el cerebrito real de un cliente). Antes
// de arrancar nada: si un puerto esta ocupado, la suite ABORTA con la razon.
import net from 'node:net';

function libre(puerto, host) {
  return new Promise((resolve) => {
    const s = net.createServer();
    s.once('error', () => resolve(false));
    s.once('listening', () => s.close(() => resolve(true)));
    s.listen(puerto, host);
  });
}

export async function exigirPuertosLibres(puertos) {
  for (const p of puertos) {
    // El asistente escucha en 127.0.0.1 y el POS en 0.0.0.0: probar como ellos.
    const ok = (await libre(p, '127.0.0.1')) && (await libre(p));
    if (!ok) {
      console.log(`ABORTADA: el puerto ${p} esta ocupado en esta maquina.`);
      console.log('Casi seguro hay un cerebrito REAL corriendo (autoarranque).');
      console.log('Cierralo antes de correr la suite (o corre la suite en otra');
      console.log('maquina): esta prueba JAMAS debe hablarle al de produccion.');
      process.exit(1);
    }
  }
}
