// extract.js — RC extraction example (extract → extresist → ext2spice).
//
// Usage:  node examples/extract.js [magFile [tech [outputDir]]]
import { createMagic, vfsWrite, vfsRead, loadCell, loadScript,
         DEFAULT_TECH, DEFAULT_MAG, DEFAULT_OUT } from './helpers.js';
import { writeFileSync, mkdirSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { resolve } from 'node:path';

export async function run({ magFile = DEFAULT_MAG, tech = DEFAULT_TECH, outputDir = DEFAULT_OUT } = {}) {
  const { magic } = await createMagic();
  const { FS } = magic;
  const { tech: techName, cell } = loadCell(FS, tech, magFile);

  magic.runScript(loadScript('extract.tcl', techName, cell));

  mkdirSync(outputDir, { recursive: true });

  const extData = vfsRead(FS, `/work/${cell}.ext`);
  if (!extData) throw new Error(`Extraction failed: /work/${cell}.ext not created`);
  writeFileSync(resolve(outputDir, `${cell}.ext`), extData);

  const resExtData = vfsRead(FS, `/work/${cell}.res.ext`);
  if (resExtData) writeFileSync(resolve(outputDir, `${cell}.res.ext`), resExtData);

  const spiceData = vfsRead(FS, `/work/${cell}.spice`) ?? vfsRead(FS, `/work/${cell}.spc`);
  const spiceExt  = vfsRead(FS, `/work/${cell}.spice`) ? 'spice' : 'spc';
  if (spiceData) writeFileSync(resolve(outputDir, `${cell}.${spiceExt}`), spiceData);

  return {
    ext:   resolve(outputDir, `${cell}.ext`),
    spice: spiceData ? resolve(outputDir, `${cell}.${spiceExt}`) : null,
  };
}

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  const { ext, spice } = await run().catch(e => { console.error(e.message ?? e); process.exit(1); });
  console.log(`\next:   ${ext}`);
  if (spice) console.log(`spice: ${spice}`);
  console.log('Done.');
}
