/**
 * Build script: compile stubs/hf-early-stub.ts → src/generated/hf-early-stub-inline.ts
 *
 * Run via: bun run scripts/build-hf-early-stub.ts
 * (also called automatically as part of `bun run build`)
 *
 * Output format mirrors packages/core/scripts/build-hyperframes-runtime-artifact.ts:
 * a TypeScript module exporting a single string-constant getter that is
 * compiled by tsc into dist/ — no esbuild, no file I/O, no dynamic paths at
 * runtime.
 */

import { mkdirSync, writeFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import { buildSync } from "esbuild";
import { execSync } from "node:child_process";

const thisDir = dirname(fileURLToPath(import.meta.url));
const repoRoot = resolve(thisDir, "..");

const stubEntry = resolve(repoRoot, "stubs/hf-early-stub.ts");
const generatedDir = resolve(repoRoot, "src/generated");
const outPath = resolve(generatedDir, "hf-early-stub-inline.ts");

// ── Compile the stub to a self-contained IIFE ─────────────────────────────────
const result = buildSync({
  entryPoints: [stubEntry],
  bundle: true,
  write: false,
  platform: "browser",
  format: "iife",
  target: ["es2020"],
  // Minify for production — the stub is injected on every page load.
  minify: true,
  legalComments: "none",
});

const iife = result.outputFiles[0]?.text ?? "";
if (!iife) {
  throw new Error("esbuild produced no output for hf-early-stub.ts");
}

// ── Write the generated module ────────────────────────────────────────────────
mkdirSync(generatedDir, { recursive: true });

const escaped = JSON.stringify(iife);
writeFileSync(
  outPath,
  [
    "// AUTO-GENERATED by scripts/build-hf-early-stub.ts — do not edit",
    `const HF_EARLY_STUB_IIFE: string = ${escaped};`,
    "",
    "/**",
    " * Returns the pre-built HyperFrames early stub IIFE as a string constant.",
    " * Inject into <head> before any other scripts so the GSAP batching",
    " * interceptor is in place when user composition scripts run.",
    " */",
    "export function getHfEarlyStub(): string {",
    "  return HF_EARLY_STUB_IIFE;",
    "}",
    "",
  ].join("\n"),
  "utf8",
);

// Format the generated file so `oxfmt --check` passes in CI.
// Errors are intentionally swallowed — oxfmt unavailable in some envs.
try {
  execSync(`bunx oxfmt ${outPath}`, { stdio: "ignore" });
} catch {
  // not fatal
}

console.log(
  JSON.stringify({
    event: "hf_early_stub_generated",
    stubEntry,
    outPath,
    bytes: Buffer.byteLength(iife, "utf8"),
  }),
);
