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 listPrd = fs.readFileSync(path.join(protoRoot, '.spec/requirements-prd-list.md'), 'utf8');
const detailPrd = fs.readFileSync(path.join(protoRoot, '.spec/requirements-prd-detail.md'), 'utf8');

const NODE_DEFS = [
  { id: 'vm-doc-toolbar', title: '测试用例下载', pageId: ['list', 'detail'], color: '#64748b', aiPrompt: '右上角测试用例下载工具栏。', annotationText: '下载 Excel 测试用例。' },
  { id: 'vm-filter', title: '筛选条件', pageId: 'list', color: '#2563eb', aiPrompt: '列表筛选区字段与查询逻辑。', annotationText: '' },
  { id: 'vm-kpi-all', title: '所有营运车辆', pageId: 'list', color: '#64748b', aiPrompt: 'KPI 口径与点击筛选。', annotationText: '未退出运营、可用于交付的车辆总数。点击切换列表筛选。' },
  { id: 'vm-kpi-lease', title: '租赁车辆', pageId: 'list', color: '#2563eb', aiPrompt: '租赁运营状态 KPI。', annotationText: '运营状态为「租赁」且已交付租赁业务项目的车辆。' },
  { id: 'vm-kpi-self', title: '自营车辆', pageId: 'list', color: '#059669', aiPrompt: '自营运营状态 KPI。', annotationText: '运营状态为「自营」且已交付自营业务项目的车辆。' },
  { id: 'vm-kpi-stock', title: '库存车辆', pageId: 'list', color: '#d97706', aiPrompt: '在库车辆 KPI。', annotationText: '运营状态为「可运营」或「待运营」的在库车辆。' },
  { id: 'vm-kpi-nonOperating', title: '非运营车辆', pageId: 'list', color: '#7c3aed', aiPrompt: '非运营车辆 KPI。', annotationText: '公务车、观光车等不可用于租赁或自营业务的车辆。' },
  { id: 'vm-kpi-exit', title: '退出运营车辆', pageId: 'list', color: '#64748b', aiPrompt: '退出运营 KPI。', annotationText: '已退出运营，不可再用于租赁或自营业务。' },
  { id: 'vm-kpi-licenseAbnormal', title: '证照异常车辆', pageId: 'list', color: '#dc2626', aiPrompt: '证照异常与交车限制。', annotationText: '证照状态异常；须将行驶证有效期更新至未过期才可交车。' },
  { id: 'vm-kpi-insuranceAbnormal', title: '保险异常车辆', pageId: 'list', color: '#dc2626', aiPrompt: '保险异常与交车限制。', annotationText: '交强险或商业险已到期；完成采购前不可用于租赁/自营交车。' },
  { id: 'vm-table-toolbar', title: '导出与批量导入', pageId: 'list', color: '#0f766e', aiPrompt: '列表工具栏操作。', annotationText: '导出当前筛选结果；批量导入按模板校验（原型为 Toast 演示）。' },
  { id: 'vm-vehicle-table', title: '台账列表', pageId: 'list', color: '#2563eb', aiPrompt: '车辆台账表格列与操作。', annotationText: '' },
  { id: 'vm-import-modal', title: '批量导入', pageId: 'list', color: '#0f766e', aiPrompt: 'CSV 模板下载与上传。', annotationText: '' },
  { id: 'vm-edit-modal', title: '编辑车辆', pageId: 'list', color: '#7c3aed', aiPrompt: '管理员编辑车辆档案。', annotationText: '管理员通过操作列「更多 → 编辑」打开。' },
  { id: 'vm-ops-modal', title: '运维负责人', pageId: 'list', color: '#d97706', aiPrompt: '列表页运维负责人弹窗。', annotationText: '' },
  { id: 'vm-operate-city-modal', title: '修改运营城市', pageId: 'list', color: '#0891b2', aiPrompt: '列表页运营城市弹窗。', annotationText: '仅来源为「人工」时可修改。' },
  { id: 'vm-location-map-modal', title: '车辆定位地图', pageId: 'list', color: '#2563eb', aiPrompt: 'GPS 地图弹窗。', annotationText: '点击「当前位置」打开。' },
  { id: 'vm-detail-hero', title: '车辆概要', pageId: 'detail', color: '#2563eb', aiPrompt: '详情页头部信息。', annotationText: '车牌、品牌型号、VIN、在线状态、运营城市与 GPS 时间。' },
  { id: 'vm-detail-stats', title: '统计条', pageId: 'detail', color: '#0f766e', aiPrompt: '运营城市、里程、停放区域、运维负责人。', annotationText: '' },
  { id: 'vm-detail-tabs', title: 'Tab 导航', pageId: 'detail', color: '#64748b', aiPrompt: '详情页 11 个 Tab。', annotationText: '' },
  { id: 'vm-detail-tab-basic', title: '基本信息 Tab', pageId: 'detail', color: '#2563eb', aiPrompt: '档案、项目、证照摘要。', annotationText: '' },
  { id: 'vm-detail-tab-model', title: '型号参数 Tab', pageId: 'detail', color: '#64748b', aiPrompt: '车型参数与保养项目。', annotationText: '展示车型技术参数表与保养项目清单（只读）。' },
  { id: 'vm-detail-tab-license', title: '证照信息 Tab', pageId: 'detail', color: '#d97706', aiPrompt: '行驶证与营运证展示。', annotationText: '分组展示证照字段与照片预览。' },
  { id: 'vm-detail-tab-insurance', title: '保险记录 Tab', pageId: 'detail', color: '#059669', aiPrompt: '险种概览与采购历史。', annotationText: '' },
  { id: 'vm-detail-tab-lease', title: '租赁记录 Tab', pageId: 'detail', color: '#2563eb', aiPrompt: '合同与交还车历史。', annotationText: '合同号、交车/还车日期可跳转对应管理模块（原型 Toast）。' },
  { id: 'vm-detail-tab-accident', title: '事故记录 Tab', pageId: 'detail', color: '#dc2626', aiPrompt: '事故记录筛选与列表。', annotationText: '按车牌过滤种子数据；可跳转事故详情（原型演示）。' },
  { id: 'vm-detail-tab-fault', title: '故障记录 Tab', pageId: 'detail', color: '#d97706', aiPrompt: '故障记录筛选与操作。', annotationText: '支持查看详情与编辑故障记录（原型 Toast）。' },
  { id: 'vm-detail-tab-violation', title: '违章记录 Tab', pageId: 'detail', color: '#7c3aed', aiPrompt: '违章记录列表。', annotationText: '按当前车辆过滤；可跳转违章管理详情（原型演示）。' },
  { id: 'vm-detail-tab-movement', title: '异动记录 Tab', pageId: 'detail', color: '#0891b2', aiPrompt: '异动记录列表。', annotationText: '展示车辆异动历史；可跳转异动管理详情（原型演示）。' },
  { id: 'vm-detail-tab-transfer', title: '调拨记录 Tab', pageId: 'detail', color: '#0f766e', aiPrompt: '调拨记录列表。', annotationText: '展示车辆调拨历史；可跳转调拨详情（原型演示）。' },
  { id: 'vm-detail-tab-annual', title: '年审记录 Tab', pageId: 'detail', color: '#0891b2', aiPrompt: '年审历史列表。', annotationText: '对齐年审管理历史列表；可跳转年审详情（原型演示）。' },
];

const prdByKey = { list: listPrd, detail: detailPrd };

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\d+\./.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 extractFromPrd({ prd, heading, sub, combine }) {
  const md = prdByKey[prd];
  if (!md) return null;
  if (combine?.length) {
    return combine.map((h) => extractSection(md, h)).filter(Boolean).join('\n\n---\n\n') || null;
  }
  const base = extractSection(md, heading);
  if (!base) return null;
  if (!sub) return base;
  return extractSection(base, sub) ?? base;
}

const NODE_PRD_MAP = {
  'vm-filter': { prd: 'list', heading: '## 4. 筛选区' },
  'vm-table-toolbar': { prd: 'list', heading: '## 6. 列表工具栏' },
  'vm-import-modal': { prd: 'list', heading: '## 6. 列表工具栏' },
  'vm-vehicle-table': { prd: 'list', heading: '## 7. 列表字段说明' },
  'vm-ops-modal': { prd: 'list', heading: '## 8. 弹窗交互', sub: '### 8.1 设置运维负责人' },
  'vm-operate-city-modal': { prd: 'list', heading: '## 8. 弹窗交互', sub: '### 8.2 修改运营城市' },
  'vm-edit-modal': { prd: 'list', heading: '## 8. 弹窗交互', sub: '### 8.3 编辑车辆（管理员）' },
  'vm-location-map-modal': { prd: 'list', heading: '## 8. 弹窗交互', sub: '### 8.4 地图' },
  'vm-detail-hero': { prd: 'detail', heading: '## 2. 页面框架', combine: ['### 2.1 顶栏', '### 2.2 车辆概要区'] },
  'vm-detail-stats': { prd: 'detail', heading: '## 2. 页面框架', sub: '### 2.3 统计条（4 项）' },
  'vm-detail-tabs': { prd: 'detail', heading: '## 3. Tab 总览' },
  'vm-detail-tab-basic': { prd: 'detail', heading: '## 4. 基本信息 Tab' },
  'vm-detail-tab-model': { prd: 'detail', heading: '## 5. 型号参数 Tab' },
  'vm-detail-tab-license': { prd: 'detail', heading: '## 6. 证照信息 Tab' },
  'vm-detail-tab-insurance': { prd: 'detail', heading: '## 7. 保险记录 Tab' },
  'vm-detail-tab-lease': { prd: 'detail', heading: '## 8. 租赁记录 Tab' },
  'vm-detail-tab-accident': { prd: 'detail', heading: '## 9. 事故记录 Tab' },
  'vm-detail-tab-fault': { prd: 'detail', heading: '## 10. 故障记录 Tab' },
  'vm-detail-tab-violation': { prd: 'detail', heading: '## 11. 违章记录 Tab' },
  'vm-detail-tab-movement': { prd: 'detail', heading: '## 12. 异动记录 Tab' },
  'vm-detail-tab-transfer': { prd: 'detail', heading: '## 13. 调拨记录 Tab' },
  'vm-detail-tab-annual': { prd: 'detail', heading: '## 14. 年审记录 Tab' },
};

const KPI_ROW_LABELS = {
  'vm-kpi-all': '所有营运车辆',
  'vm-kpi-lease': '租赁车辆',
  'vm-kpi-self': '自营车辆',
  'vm-kpi-stock': '库存车辆',
  'vm-kpi-nonOperating': '非运营车辆',
  'vm-kpi-exit': '退出运营车辆',
  'vm-kpi-licenseAbnormal': '证照异常车辆',
  'vm-kpi-insuranceAbnormal': '保险异常车辆',
};

const markdownSupplements = {
  'vm-filter': '### 原型实现补充\n\n- **区域**：华东 / 华南 / 华中 / 华北 / 东北 / 西南 / 西北；按运营城市所在省份映射过滤',
  'vm-detail-stats': '### 原型实现补充\n\n- **运营城市**、**运维负责人**：详情页使用内联编辑面板（非弹窗）',
  'vm-ops-modal': '### 原型实现补充\n\n- 详情页统计条改用内联编辑面板（非弹窗）',
  'vm-operate-city-modal': '### 原型实现补充\n\n- 详情页统计条改用内联选择器（非弹窗）',
  'vm-detail-hero': '### 原型实现补充\n\n- 顶栏仅保留「返回列表」与「下载测试用例」',
  'vm-doc-toolbar': `## 下载测试用例\n\n右上角工具栏，列表页与详情页均可用；下载含列表/详情两个 Sheet 的 Excel。`,
};

function buildFallbackMarkdown(node) {
  const parts = [`# ${node.title}`, ''];
  if (node.aiPrompt) parts.push(node.aiPrompt, '');
  if (node.annotationText?.trim()) parts.push('## 说明', '', node.annotationText.trim());
  return parts.join('\n').trim();
}

function buildKpiMarkdown(nodeId) {
  const section = extractFromPrd({ prd: 'list', heading: '## 5. KPI 分类卡片' });
  if (!section) return null;
  const label = KPI_ROW_LABELS[nodeId];
  const rowLine = label
    ? section.split('\n').find((line) => line.includes(`| ${label} |`))
    : null;
  const focus = rowLine ? `## 当前卡片口径\n\n${rowLine}\n\n---\n\n` : '';
  return `${focus}${section}`.trim();
}

function buildNodeMarkdown(node) {
  if (KPI_ROW_LABELS[node.id]) {
    return buildKpiMarkdown(node.id) ?? buildFallbackMarkdown(node);
  }
  if (node.id === 'vm-doc-toolbar' && markdownSupplements['vm-doc-toolbar']) {
    return markdownSupplements['vm-doc-toolbar'];
  }
  const mapping = NODE_PRD_MAP[node.id];
  if (mapping) {
    const prdBody = extractFromPrd(mapping);
    if (prdBody) {
      const supplement = markdownSupplements[node.id];
      return supplement
        ? `${prdBody.replace(/\n---\s*$/, '')}\n\n---\n\n${supplement}`
        : prdBody;
    }
  }
  return buildFallbackMarkdown(node);
}

const now = Date.now();
const nodes = NODE_DEFS.map((def, index) => ({
  id: def.id,
  index: index + 1,
  title: def.title,
  pageId: def.pageId,
  locator: {
    selectors: [`[data-annotation-id="${def.id}"]`],
    fingerprint: def.id,
    path: [],
  },
  aiPrompt: def.aiPrompt,
  annotationText: def.annotationText,
  hasMarkdown: true,
  color: def.color,
  images: [],
  createdAt: 1740096000000,
  updatedAt: 1740096000000,
}));

const markdownMap = Object.fromEntries(nodes.map((node) => [node.id, buildNodeMarkdown(node)]));

const listPageNodes = nodes.filter((n) => {
  const pages = Array.isArray(n.pageId) ? n.pageId : [n.pageId];
  return pages.includes('list');
});
const detailPageNodes = nodes.filter((n) => {
  const pages = Array.isArray(n.pageId) ? n.pageId : [n.pageId];
  return pages.includes('detail');
});

const source = {
  documentVersion: 1,
  format: 'axhub-annotation-source',
  data: {
    version: 2,
    prototypeName: 'vehicle-management',
    pageId: 'list',
    updatedAt: now,
    nodes,
  },
  markdownMap,
  assetMap: {},
  directory: {
    nodes: [
      {
        type: 'folder',
        id: 'vm-doc-root',
        title: '车辆管理说明',
        defaultExpanded: true,
        children: [
          {
            type: 'markdown',
            id: 'vm-doc-overview',
            title: '模块总览',
            markdown: extractSection(listPrd, '## 1. 模块定位') ?? '# 车辆管理',
          },
          {
            type: 'link',
            id: 'vm-link-self',
            title: '车辆管理原型',
            href: '/prototypes/vehicle-management',
            target: 'self',
          },
          {
            type: 'folder',
            id: 'vm-doc-prd',
            title: 'PRD 全文',
            defaultExpanded: false,
            children: [
              { type: 'markdown', id: 'vm-doc-prd-list', title: '列表页 PRD', markdown: listPrd },
              { type: 'markdown', id: 'vm-doc-prd-detail', title: '详情页 PRD', markdown: detailPrd },
            ],
          },
          {
            type: 'folder',
            id: 'vm-doc-list',
            title: '列表页模块',
            defaultExpanded: true,
            children: [
              {
                type: 'route',
                id: 'vm-route-list',
                title: '打开列表页',
                route: 'vehicle-management:list',
                payload: { pageId: 'list' },
              },
              ...listPageNodes.map((node) => ({
                type: 'markdown',
                id: `vm-doc-node-${node.id}`,
                title: node.title,
                markdown: markdownMap[node.id],
              })),
            ],
          },
          {
            type: 'folder',
            id: 'vm-doc-detail',
            title: '详情页模块',
            defaultExpanded: true,
            children: [
              {
                type: 'route',
                id: 'vm-route-detail',
                title: '打开详情页',
                route: 'vehicle-management:detail',
                payload: { pageId: 'detail' },
              },
              ...detailPageNodes.map((node) => ({
                type: 'markdown',
                id: `vm-doc-node-${node.id}`,
                title: node.title,
                markdown: markdownMap[node.id],
              })),
            ],
          },
        ],
      },
    ],
  },
};

fs.writeFileSync(
  path.join(protoRoot, 'annotation-source.json'),
  `${JSON.stringify(source, null, 2)}\n`,
  'utf8',
);

console.log(`Built annotation-source.json with ${nodes.length} nodes.`);
