// @xxz_cocoscreator/framework-packages postinstall: 把内含的 Cocos 编辑器扩展「拷贝」到项目 extensions/
//
// Cocos 只从 <project>/extensions/ 或全局扩展目录加载扩展，不扫描 node_modules，
// 故必须拷贝。每个扩展子目录的 package.json 含 `editor` 字段（Cocos 扩展标记），
// 目标文件夹用其清单 name（layer-generator / excel-to-lang）。
//
// 用法:
//   node scripts/sync.mjs [项目根]            # 拷贝(默认 INIT_CWD)
//   node scripts/sync.mjs --unlink [项目根]   # 移除
import { existsSync, cpSync, rmSync, readdirSync, readFileSync, statSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { resolve, join } from 'node:path';

const args = process.argv.slice(2);
const unlink = args.includes('--unlink');
const posArg = args.find((a) => !a.startsWith('--'));

const pkgRoot = fileURLToPath(new URL('..', import.meta.url));
const projectRoot = resolve(posArg || process.env.INIT_CWD || process.cwd());
const extRoot = resolve(projectRoot, 'extensions');

// 发现本包内的 Cocos 扩展子目录（package.json 含 editor 字段）
const exts = readdirSync(pkgRoot)
  .filter((n) => { try { return statSync(join(pkgRoot, n)).isDirectory(); } catch { return false; } })
  .map((n) => {
    const pj = join(pkgRoot, n, 'package.json');
    if (!existsSync(pj)) return null;
    try { const m = JSON.parse(readFileSync(pj, 'utf8')); return m.editor ? { dir: n, name: m.name || n } : null; }
    catch { return null; }
  })
  .filter(Boolean);

for (const { dir, name } of exts) {
  // 目标用源文件夹名（dir），覆盖项目已有同名扩展，避免与清单 name 产生重复扩展
  const dst = join(extRoot, dir);
  if (existsSync(dst)) rmSync(dst, { recursive: true, force: true });
  if (unlink) { console.log(`[framework-packages] 已移除: extensions/${dir}`); continue; }
  cpSync(join(pkgRoot, dir), dst, { recursive: true });
  console.log(`[framework-packages] 已拷贝扩展: extensions/${dir}  (${name})`);
}
if (!exts.length) console.log('[framework-packages] 未发现含 editor 字段的扩展子目录');
