# -*- coding: utf-8 -*-
"""把教材精读增强的 4 个分片拼装成增强版讲稿，并与原版逐页对比校验。

- 保留原讲稿的章级头部（`## 一、教学目标` 等）
- 页锚点必须 2.1–2.28 齐全、不重不漏
- 统计每页口播字数，与原版对比（增量）
输出：第2章-软件项目启动-讲稿-教材精读增强版.md
"""
import glob
import os
import re
import sys

BASE = os.path.dirname(os.path.abspath(__file__))
ORIG = os.path.join(BASE, '第2章-软件项目启动-讲稿.md')
OUT = os.path.join(BASE, '第2章-软件项目启动-讲稿-教材精读增强版.md')
ANCHOR = re.compile(r'^###\s*【(\d+)\.(\d+)】(.+?)（\s*(\d+(?:\.\d+)?)\s*分钟\s*）\s*$', re.M)
SPOKEN = re.compile(r'>\s*\*\*口播\*\*[：:]([\s\S]*?)(?=\n\*\*|\Z)')


def blocks(text):
    ms = list(ANCHOR.finditer(text))
    out = {}
    for i, m in enumerate(ms):
        end = ms[i + 1].start() if i + 1 < len(ms) else len(text)
        out[int(m.group(2))] = {
            'anchor': '### 【%s.%s】%s（%s 分钟）' % (m.group(1), m.group(2), m.group(3), m.group(4)),
            'body': text[m.end():end].strip(),
            'title': m.group(3), 'min': m.group(4),
        }
    return out


def spoken_len(body):
    m = SPOKEN.search(body)
    if not m:
        return 0
    return len(re.sub(r'[\s\*#>]', '', re.sub(r'^>', '', m.group(1), flags=re.M)))


def main():
    orig_txt = open(ORIG, encoding='utf-8').read()
    first = ANCHOR.search(orig_txt)
    head = orig_txt[:first.start()].rstrip()
    orig = blocks(orig_txt)

    new = {}
    for p in sorted(glob.glob(os.path.join(BASE, '_parts_enriched', 'ch2-a*.md'))):
        for k, v in blocks(open(p, encoding='utf-8').read()).items():
            if k in new:
                print('✗ 页 %d 重复（%s）' % (k, os.path.basename(p)))
                return 1
            new[k] = v
        print('  读入 %s（%d 页）' % (os.path.basename(p), len(blocks(open(p, encoding='utf-8').read()))))

    missing = [i for i in range(1, 29) if i not in new]
    if missing:
        print('✗ 缺页：%s' % missing)
        return 1

    o_chars = sum(len(v['body']) for v in orig.values())
    n_chars = sum(len(v['body']) for v in new.values())
    o_sp = sum(spoken_len(v['body']) for v in orig.values())
    n_sp = sum(spoken_len(v['body']) for v in new.values())
    print('\n%-6s %-30s %8s %8s %8s' % ('页', '标题', '原口播', '新口播', '增量'))
    for i in range(1, 29):
        a, b = spoken_len(orig[i]['body']), spoken_len(new[i]['body'])
        print('2.%-4d %-30s %8d %8d %+8d' % (i, new[i]['title'][:28], a, b, b - a))
    print('\n合计：正文 %d → %d 字（%+d）｜ 口播 %d → %d 字（%+d，×%.2f）'
          % (o_chars, n_chars, n_chars - o_chars, o_sp, n_sp, n_sp - o_sp, n_sp / max(1, o_sp)))
    out = head + '\n\n' + '\n\n'.join(new[i]['anchor'] + '\n\n' + new[i]['body'] for i in range(1, 29)) + '\n'
    open(OUT, 'w', encoding='utf-8').write(out)
    print('✓ 已写出 %s（%.1f 万字符，含 %d 个页块）'
          % (os.path.basename(OUT), len(out) / 10000, len(new)))
    return 0


if __name__ == '__main__':
    sys.exit(main())
