// Compila LOS INSTALADORES con el compilador de C# que ya trae Windows.
// Salen dos ejecutables de KILOBYTES: Instalar-Estacion-Fiscal.exe e
// Instalar-Cerebrito.exe. (Se probo empaquetarlos con el mismo metodo de los
// programas y pesaban 92 MB cada uno, lo mismo que lo que instalan: un
// instalador asi no aporta nada.)
//
// ⚠ A PROPOSITO NO EXISTE un instalador que traiga los dos. La Estacion Fiscal
// es el sistema de facturacion (sujeto a homologacion ante el SENIAT) y el
// Cerebrito es gestion del negocio, que no emite documentos fiscales.
// Entregarlos como un solo paquete difuminaria esa frontera, y ademas
// encerraria a la Estacion dentro de Gustito cuando le sirve a cualquier
// comercio con cualquier sistema.
//
// Correr:  npm run empaquetar -w @gustito/instalador
import { execFileSync } from 'node:child_process';
import { existsSync, mkdirSync, readdirSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';

const AQUI = dirname(fileURLToPath(import.meta.url));
const SALIDA = join(AQUI, 'dist-exe');
mkdirSync(SALIDA, { recursive: true });

/** El compilador de C# viene con .NET Framework, en todo Windows. */
function buscarCsc() {
  const base = 'C:\\Windows\\Microsoft.NET\\Framework64';
  if (!existsSync(base)) throw new Error('No se encontro .NET Framework en este equipo.');
  const versiones = readdirSync(base)
    .filter((d) => d.startsWith('v4.'))
    .sort()
    .reverse();
  for (const v of versiones) {
    const csc = join(base, v, 'csc.exe');
    if (existsSync(csc)) return csc;
  }
  throw new Error('No se encontro csc.exe (compilador de C#).');
}

const csc = buscarCsc();
const fuente = join(AQUI, 'src', 'Instalador.cs');
const icono = join(AQUI, 'recursos', 'icono.ico');

const PRODUCTOS = [
  { exe: 'Instalar-Estacion-Fiscal.exe', define: 'PRODUCTO_ESTACION' },
  { exe: 'Instalar-Cerebrito.exe', define: 'PRODUCTO_CEREBRITO' },
];

for (const p of PRODUCTOS) {
  const salida = join(SALIDA, p.exe);
  execFileSync(
    csc,
    [
      '/nologo',
      '/target:winexe',
      '/optimize+',
      '/codepage:65001',
      `/define:${p.define}`,
      '/reference:System.dll',
      '/reference:System.Drawing.dll',
      '/reference:System.Windows.Forms.dll',
      `/win32icon:${icono}`,
      `/out:${salida}`,
      fuente,
    ],
    { stdio: 'inherit' },
  );
  console.log('Listo: ' + salida);
}

console.log('\nLos dos instaladores quedaron en ' + SALIDA);
