import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const protoRoot = path.resolve(__dirname, '..');
const prdPath = path.resolve(protoRoot, '../../resources/contract-template-management/PRD.md');
const sourcePath = path.join(protoRoot, 'annotation-source.json');

const fullPrd = fs.readFileSync(prdPath, 'utf8');
const source = JSON.parse(fs.readFileSync(sourcePath, 'utf8'));

function extractSection(md, startHeading) {
  const lines = md.split('\n');
  let start = lines.findIndex((line) => line.trim() === startHeading || line.startsWith(startHeading));
  if (start < 0) return null;
  const startLevel = (lines[start].match(/^(#+)/)?.[1] ?? '##').length;
  let end = lines.length;
  for (let i = start + 1; i < lines.length; i++) {
    if (/^#{1,6}\s/.test(lines[i])) {
      const level = lines[i].match(/^(#+)/)?.[1].length ?? 2;
      if (level <= startLevel) {
        end = i;
        break;
      }
    }
  }
  return lines.slice(start, end).join('\n').trim();
}

function combineSections(headings) {
  return headings.map((h) => extractSection(fullPrd, h)).filter(Boolean).join('\n\n---\n\n');
}

const overviewMd = `## 模块定位

| 项 | 说明 |
|---|---|
| 模块名称 | 合同模板管理 |
| 目标用户 | 法务人员 |
| 核心任务 | 维护 Word 版商用车租赁合同模板，按章节编辑，发布版本并控制启用态 |
| 数据模型 | 一份 Word 文件 = 一条记录，内含 9 个章节内容 |
| PRD 文档 | 见目录「PRD 全文 → PRD 完整文档」 |
| 资源文件 | \`src/resources/contract-template-management/PRD.md\` |

---

### 产品目标（摘要）

| 目标 | 说明 |
|---|---|
| 降低维护成本 | 一份 Word 文件 = 一条记录，导入后自动拆分章节 |
| 保证合规可控 | 支持锁定区、风控红线条款标记与统计 |
| 支撑业务差异化 | 附件章节按车型绑定；各章节均支持条件条款 |
| 版本可追溯 | 草稿 / 已发布分离；发布变更写入版本日志 |
| 多套模板并存 | 租赁创建时由用户选择已启用模板 |

**同步命令**：\`node src/prototypes/contract-template-management/scripts/build-annotation-source.mjs\``;

const DOC_MARKDOWN = {
  'ct-doc-overview': overviewMd,
  'ct-doc-prd-full': fullPrd,
  'ct-doc-prd-overview': combineSections(['## 1. 背景与目标', '## 2. 用户与场景', '## 3. 名词解释', '## 4. 信息架构', '## 5. 数据模型', '## 6. 业务规则（全局）']),
  'ct-doc-prd-list': `# 合同模板管理 · 列表页 PRD\n\n${extractSection(fullPrd, '## 7. 列表页需求') ?? ''}`,
  'ct-doc-prd-editor': `# 合同模板管理 · 编辑/新增页 PRD\n\n${extractSection(fullPrd, '## 8. 编辑 / 新增页需求') ?? ''}`,
  'ct-doc-prd-acceptance': extractSection(fullPrd, '## 16. 验收标准') ?? '## 16. 验收标准',
  'ct-doc-node-filter': extractSection(fullPrd, '### 7.2 筛选区') ?? '',
  'ct-doc-node-table': combineSections(['### 7.4 主表字段', '### 7.5 主表操作', '### 7.6 子表（展开行）']),
  'ct-doc-node-tabs': combineSections(['### 8.3 章节 Tab', '### 8.4 条件条款说明（合同主体及租赁订单～安全责任协议）', '### 8.5 适用车型绑定（仅附件章节 Tab）']),
  'ct-doc-node-workspace': combineSections(['### 8.6 编辑区（左侧）', '### 8.7 实时预览（右侧）']),
  'ct-doc-annotation-hint': '## 标注查看提示\n\n右侧标注工具栏可浏览目录、切换主题与颜色筛选。列表页与编辑页标注按当前页面自动显隐。\n\n**PRD 同步**：目录「PRD 全文」已与 `src/resources/contract-template-management/PRD.md` 对齐；修改 PRD 后运行 `node src/prototypes/contract-template-management/scripts/build-annotation-source.mjs` 重新生成 `annotation-source.json`。',
};

const MARKDOWN_MAP = {
  'ct-list-filter': `### 7.2 筛选区\n\n${extractSection(fullPrd, '### 7.2 筛选区')?.replace(/^### 7\.2 筛选区\n*/m, '') ?? ''}`.trim(),
  'ct-list-table': combineSections(['### 7.4 主表字段', '### 7.5 主表操作', '### 7.6 子表（展开行）']),
  'ct-editor-topbar': combineSections(['### 8.2 顶栏', '### 6.2 保存与发布']),
  'ct-section-tabs': extractSection(fullPrd, '### 8.3 章节 Tab') ?? '',
  'ct-contract-type': source.markdownMap?.['ct-contract-type'] ?? '',
  'ct-vehicle-binding': extractSection(fullPrd, '### 8.5 适用车型绑定（仅附件章节 Tab）') ?? source.markdownMap?.['ct-vehicle-binding'] ?? '',
  'ct-editor-panel': combineSections(['### 8.6 编辑区（左侧）']),
  'ct-preview-panel': extractSection(fullPrd, '### 8.7 实时预览（右侧）') ?? '',
};

function patchDirectoryMarkdown(nodes) {
  for (const node of nodes ?? []) {
    if (node.type === 'markdown' && DOC_MARKDOWN[node.id]) {
      node.markdown = DOC_MARKDOWN[node.id];
      if (node.id === 'ct-doc-prd-full') {
        node.markdownPath = 'src/resources/contract-template-management/PRD.md';
      }
    }
    if (node.children) patchDirectoryMarkdown(node.children);
  }
}

const ctDocRoot = source.directory?.nodes?.find((n) => n.id === 'ct-doc-root');
if (ctDocRoot) patchDirectoryMarkdown(ctDocRoot.children);

source.markdownMap = { ...source.markdownMap, ...MARKDOWN_MAP };
source.data.updatedAt = Date.now();

fs.writeFileSync(sourcePath, `${JSON.stringify(source, null, 2)}\n`);
console.log(`Synced annotation-source.json from PRD.md (${fullPrd.length} chars).`);
