// Empaqueta la Estacion Fiscal como UN SOLO .exe de Windows (Node SEA).
// Se copia a la laptop del negocio, se abre, y queda escuchando: una
// instalacion, un RIF.
//
// ⚠ DIFERENCIA IMPORTANTE CON EL CEREBRITO: este programa NO se actualiza solo.
// La Providencia 000121 (arts. 9 al 11) exige que CADA VERSION del sistema de
// facturacion se homologue ANTES de liberarse. Un auto-update silencioso
// pondria a correr en el negocio una version que el SENIAT no aprobo. Por eso
// aca no hay actualizador: las versiones se entregan a mano y solo las
// aprobadas.
//
// Correr:  npm run empaquetar -w @gustito/fiscal
import { execFileSync } from 'node:child_process';
import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';

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

// 1) Todo el codigo en un solo archivo. Aca NO se inyecta ninguna llave: los
// datos del negocio y los de la imprenta se cargan en la propia estacion, en el
// equipo, porque cada instalacion es de un RIF distinto.
const VERSION = JSON.parse(readFileSync(join(AQUI, 'package.json'), 'utf8')).version ?? '0.0.0';
const esbuild = join(RAIZ, 'node_modules', '.bin', process.platform === 'win32' ? 'esbuild.cmd' : 'esbuild');
execFileSync(
  esbuild,
  [
    'src/index.ts',
    '--bundle',
    '--platform=node',
    '--format=cjs',
    '--target=node22',
    `--outfile=${join(SALIDA, 'estacion.cjs')}`,
    '--define:process.env.FISCAL_EMPAQUETADO="1"',
    `--define:process.env.FISCAL_VERSION=${JSON.stringify(JSON.stringify(VERSION))}`,
  ],
  { cwd: AQUI, stdio: 'inherit', shell: process.platform === 'win32' },
);

// 2) Blob SEA e inyeccion en una copia de node.exe.
const seaCfg = join(SALIDA, 'sea-config.json');
writeFileSync(
  seaCfg,
  JSON.stringify({
    main: join(SALIDA, 'estacion.cjs'),
    output: join(SALIDA, 'sea-prep.blob'),
    disableExperimentalSEAWarning: true,
  }),
);
execFileSync(process.execPath, ['--experimental-sea-config', seaCfg], { stdio: 'inherit' });

const exe = join(SALIDA, 'Estacion-Fiscal.exe');
copyFileSync(process.execPath, exe);

// 2.5) La IDENTIDAD del programa: nombre, empresa, version e icono propios.
// Sin esto el exe se presenta como "Node.js" en sus propiedades, que a los
// antivirus les huele raro y a los clientes peor. Va ANTES de inyectar el
// blob: editar los recursos despues podria corromper la seccion SEA.
const { rcedit } = await import('rcedit');
await rcedit(exe, {
  'version-string': {
    CompanyName: 'Gustito Xpress',
    ProductName: 'Estacion Fiscal',
    FileDescription: 'Estacion Fiscal: sella, resguarda y transmite los documentos del negocio',
    LegalCopyright: `(c) ${new Date().getFullYear()} Gustito Xpress`,
    OriginalFilename: 'Estacion-Fiscal.exe',
  },
  'file-version': VERSION,
  'product-version': VERSION,
  icon: join(AQUI, 'recursos', 'icono.ico'),
});

const postject = join(RAIZ, 'node_modules', 'postject', 'dist', 'cli.js');
execFileSync(
  process.execPath,
  [
    postject,
    exe,
    'NODE_SEA_BLOB',
    join(SALIDA, 'sea-prep.blob'),
    '--sentinel-fuse',
    'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2',
  ],
  { stdio: 'inherit' },
);

console.log('\nListo: ' + exe);
console.log('Se copia a la laptop del negocio y se abre. Queda en http://127.0.0.1:8739');
