// Prépare le daemon pour l'empaquetage Electron : réutilise INTÉGRALEMENT le pipeline npm du paquet
// publié (hooks prepack copy-web / inline-shared / copy-meta), donc aucune divergence de code.
//   1) build (shared + server + web) puis `npm pack` -> tarball 100 % autonome
//   2) extraction dans build/server/package
//   3) `npm install --omit=dev` -> deps runtime (node-pty avec le prebuild de la plateforme cible)
// Options : --platform=win32|darwin|linux et --arch=x64|arm64 pour un prebuild node-pty croisé
// (via npm_config_platform / npm_config_arch au moment du npm install).
import { execFileSync } from 'node:child_process';
import { mkdirSync, rmSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';

const HERE = dirname(fileURLToPath(import.meta.url));
const DESKTOP = join(HERE, '..');
const REPO = join(DESKTOP, '..', '..');
const SERVER_DIR = join(DESKTOP, 'build', 'server');

const args = process.argv.slice(2);
const arg = (name) => args.find((a) => a.startsWith(`--${name}=`))?.split('=')[1];
const platform = arg('platform');
const arch = arg('arch');

const run = (cmd, cmdArgs, cwd, env) =>
  execFileSync(cmd, cmdArgs, { cwd, stdio: 'inherit', env: { ...process.env, ...env } });

rmSync(SERVER_DIR, { recursive: true, force: true });
mkdirSync(SERVER_DIR, { recursive: true });

// 1) build + pack (le tarball embarque dist + _shared inliné + public via prepack).
// Rebuild FORCÉ de shared+server : le prepack (inline-shared) mute le dist du serveur en place
// (imports réécrits vers ./_shared) ; un tsc -b incrémental ne le régénère pas au run suivant,
// d'où un pack qui échoue. --force garantit un dist propre à imports bare avant chaque pack.
run('npx', ['tsc', '-b', '--force', 'packages/shared', 'packages/server'], REPO);
run('npm', ['run', 'build', '-w', '@arboretum/web'], REPO);
run('npm', ['pack', '-w', '@johanleroy/git-arboretum', '--pack-destination', SERVER_DIR], REPO);

// 2) extraire le tarball -> build/server/package
const tgz = readdirSync(SERVER_DIR).find((f) => f.endsWith('.tgz'));
if (!tgz) throw new Error('tarball introuvable apres npm pack');
run('tar', ['-xzf', join(SERVER_DIR, tgz), '-C', SERVER_DIR]);
rmSync(join(SERVER_DIR, tgz));

// 3) deps runtime (node-pty prebuild). Cross-compile via npm_config_platform/arch si demandé.
const pkgDir = join(SERVER_DIR, 'package');
// Retirer les devDependencies du paquet extrait : inutiles au runtime, et @arboretum/shared
// (workspace non publié, déjà inliné dans dist/_shared) n'existe sur aucun registre -> 404.
const pkgJsonPath = join(pkgDir, 'package.json');
const pj = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
delete pj.devDependencies;
writeFileSync(pkgJsonPath, `${JSON.stringify(pj, null, 2)}\n`);
const env = {};
if (platform) env.npm_config_platform = platform;
if (arch) env.npm_config_arch = arch;
run('npm', ['install', '--omit=dev', '--no-audit', '--no-fund'], pkgDir, env);

console.log(`prepare-server: build/server/package pret${platform ? ` (${platform}-${arch ?? 'host'})` : ''}`);
