// Empaqueta el cerebrito como UN SOLO .exe de Windows (Node SEA):
//   1) esbuild junta todo el codigo en un archivo CJS e inyecta la URL y la
//      llave publica (anon) leidas de ../../.env.production (el repo no lleva
//      llaves; el exe si, porque la anon es publica por diseño).
//   2) node genera el blob SEA y postject lo inyecta en una copia de node.exe.
// Salida: dist-exe/Cerebrito-Gustito.exe  (portable: se copia a la laptop y ya)
// Correr:  npm run empaquetar -w @gustito/cerebrito
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 });

const envProd = readFileSync(join(RAIZ, '.env.production'), 'utf8');
const URL = envProd.match(/VITE_SUPABASE_URL=(.+)/)?.[1]?.trim();
const ANON = envProd.match(/VITE_SUPABASE_ANON_KEY=(.+)/)?.[1]?.trim();
if (!URL || !ANON) throw new Error('No encontre las llaves en .env.production');

// 1) Bundle CJS con las llaves inyectadas.
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, 'cerebrito.cjs')}`,
    `--define:process.env.GX_URL=${JSON.stringify(JSON.stringify(URL))}`,
    `--define:process.env.GX_ANON=${JSON.stringify(JSON.stringify(ANON))}`,
  ],
  { cwd: AQUI, stdio: 'inherit', shell: process.platform === 'win32' },
);

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

const exe = join(SALIDA, 'Cerebrito-Gustito.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 VERSION = readFileSync(join(AQUI, 'src', 'actualizador.ts'), 'utf8').match(/VERSION_CEREBRITO = '([\d.]+)'/)?.[1] ?? '0.0.0';
const { rcedit } = await import('rcedit');
await rcedit(exe, {
  'version-string': {
    CompanyName: 'Gustito Xpress',
    ProductName: 'Cerebrito Gustito',
    FileDescription: 'Cerebrito Gustito: comandas, salon y cobros del negocio',
    LegalCopyright: `(c) ${new Date().getFullYear()} Gustito Xpress`,
    OriginalFilename: 'Cerebrito-Gustito.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);
