#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""am 原生 md 规整器 —— 把引擎复盘 md 变成 am 能正确转 HTML 的写法（只改版式，不改内容）

2026-10-21 用户要求: 复盘 md 的版式必须符合 answer-me-with-html 的 md→html 规范。
旧 md 的三个病:
  1. `## 模块 1:消息面与驱动归因` —— am 自动发 A/B/C 面板徽标，标题再带「模块 N:」= 双编号
  2. `#### 消息面` —— am 面板内小标题只认 `###`，`####` 是残留在正文里的孤儿级
  3. 顶部 `复盘摘要:` 裸标签 + 编号列表 —— am 把它当 intro 里的一段死文字，没有卡片
  4. 正文 `---` 分隔线 —— 会被当成 frontmatter 边界，桥接层只能删掉

规整规则（幂等）:
  - `## 模块 N:标题` → `## 标题`
  - `#### xxx` → `### xxx`
  - 删除独立的 `---` 行
  - 正文首段 `复盘摘要:` + 编号列表 → ```callout info 复盘摘要``` + `- ` 列表
"""
import re

_MODULE_RE = re.compile(r'^##\s*模块\s*\d+\s*[:：]\s*(.+?)\s*$')
_NUM_ITEM_RE = re.compile(r'^\s*\d+\s*[.、．]\s*(.+?)\s*$')


def _strip_module_numbers(lines):
    out = []
    for ln in lines:
        m = _MODULE_RE.match(ln)
        out.append(f'## {m.group(1)}' if m else ln)
    return out


def _demote_h4(lines):
    return [re.sub(r'^####\s+', '### ', ln) for ln in lines]


def _drop_rules(lines):
    return ['' if ln.strip() == '---' else ln for ln in lines]


def _summary_to_callout(lines):
    """正文首段（第一个 ## 之前）的 `复盘摘要:` + 编号列表 → callout 卡片。"""
    first_panel = next((i for i, ln in enumerate(lines) if ln.startswith('## ')), len(lines))
    head = lines[:first_panel]
    start = next((i for i, ln in enumerate(head)
                  if ln.strip() in ('复盘摘要:', '复盘摘要：')
                  or re.match(r'^\*\*复盘摘要\*\*\s*[:：]?$', ln.strip())), None)
    if start is None:
        return lines

    bullets, tail = [], []
    for ln in head[start + 1:]:
        s = ln.strip()
        if not s:
            continue
        m = _NUM_ITEM_RE.match(s)
        if m:
            bullets.append(m.group(1))
            continue
        if s.startswith(('#', '|', '>', '```')):
            tail.append(ln)
            continue
        if bullets:                      # 上一条的续行
            bullets[-1] = f'{bullets[-1]} {s}'
        else:
            bullets.append(s)
    if not bullets:
        return lines

    block = ['```callout info 复盘摘要'] + [f'- {b}' for b in bullets] + ['```']
    return head[:start] + block + [''] + tail + lines[first_panel:]


def _tidy_blank(lines):
    text = '\n'.join(lines)
    text = re.sub(r'\n{3,}', '\n\n', text)
    return text.strip() + '\n'


def normalize_md(text):
    """md → am 原生 md（幂等）。"""
    lines = text.split('\n')
    lines = _strip_module_numbers(lines)
    lines = _demote_h4(lines)
    lines = _drop_rules(lines)
    lines = _summary_to_callout(lines)
    return _tidy_blank(lines)


if __name__ == '__main__':
    import sys
    src, dst = sys.argv[1], sys.argv[2]
    with open(src, encoding='utf-8') as f:
        raw = f.read()
    with open(dst, 'w', encoding='utf-8') as f:
        f.write(normalize_md(raw))
    print(f'normalized: {src} -> {dst}')
