#!/usr/bin/env node
/**
 * 宿主 Vite 工程：打包后写入与 mstar 一致的 `serve.json`（SPA 回写 index.html）。
 *
 * 在宿主 `package.json` 中增加：`"b": "mvframe-b"`
 * 然后执行 `yarn b` 或 `yarn b [outDir] [-t|-p]`。
 *
 * - 默认：--mode development，输出目录 `dev`
 * - `-t`：--mode test，输出 `test`
 * - `-p`：--mode production，输出 `pre`（Vite 环境为 production，对应 .env.production*）
 * - 一个位置参数：自定义输出目录（与 -t / -p 同用时，以 -t / -p 为准）
 */
const { spawnSync } = require("child_process");
const fs = require("fs");
const path = require("path");
const SERVE_JSON = `{
  "rewrites": [{
    "source": "**",
    "destination": "/index.html"
  }]
}`;

function parseArgs(argv) {
  const args = argv.slice(2);
  let mode = "development";
  let outDir = "dev";
  let preset = false;
  const positional = [];

  for (const a of args) {
    if (a === "-t") {
      mode = "test";
      outDir = "test";
      preset = true;
    } else if (a === "-p") {
      mode = "production";
      outDir = "pre";
      preset = true;
    } else if (a.startsWith("-")) {
      console.error(`[mvframe-b] 未知参数: ${a}`);
      process.exit(1);
    } else {
      positional.push(a);
    }
  }

  if (positional.length > 1) {
    console.error(
      "[mvframe-b] 用法: yarn b [outDir] [-t|-p]\n  默认: outDir=dev, mode=development; -t: test/test; -p: pre/production",
    );
    process.exit(1);
  }

  if (positional.length === 1) {
    if (preset) {
      console.warn(
        `[mvframe-b] 已使用 -t/-p，忽略输出目录参数 "${positional[0]}"，实际输出: ${outDir}`,
      );
    } else {
      outDir = positional[0];
    }
  }

  return { mode, outDir };
}

/**
 * 使用磁盘路径定位 Vite CLI（Vite 7+ 的 `exports` 会阻止 `require.resolve("vite/bin/...")`）。
 */
function resolveViteCli(cwd) {
  const vpkg = path.join(cwd, "node_modules", "vite", "package.json");
  if (fs.existsSync(vpkg)) {
    const p = require(vpkg);
    const b = p.bin;
    const bin = typeof b === "string" ? b : b && b.vite;
    if (bin) {
      const cli = path.join(path.dirname(vpkg), bin);
      if (fs.existsSync(cli)) {
        return cli;
      }
    }
  }
  throw new Error(
    "未在宿主项目找到可执行的 Vite（请在工程 devDependencies 中安装 `vite` 后再执行 `yarn b` 或 `mvframe-b`）",
  );
}

function main() {
  const cwd = process.cwd();
  const { mode, outDir } = parseArgs(process.argv);
  const viteEntry = resolveViteCli(cwd);
  const env = { ...process.env, NODE_ENV: "production" };
  const child = spawnSync(
    process.execPath,
    [viteEntry, "build", "--outDir", outDir, "--mode", mode],
    { stdio: "inherit", cwd, env, shell: false },
  );
  if (child.status !== 0) {
    process.exit(child.status === null ? 1 : child.status);
  }
  const outAbs = path.resolve(cwd, outDir);
  fs.mkdirSync(outAbs, { recursive: true });
  const servePath = path.join(outAbs, "serve.json");
  fs.writeFileSync(servePath, `${SERVE_JSON}\n`, "utf8");
  console.log(`[mvframe-b] 已写入 ${path.relative(cwd, servePath)}`);
}

main();
