# -*- coding: utf-8 -*-
"""
飞鸟集书源合成器：英文原版（维基文库 Macmillan 1916）+ 墨舟 AI 中译 → feiniao.txt
================================================================================
输入：
  stray_birds_en_wikisource.txt   编号行（纯数字）+ 英文句行，逐首交替
  feiniao_zh_ai.txt               编号行 + 中文句行（与英文逐句对应）
输出 feiniao.txt（墨舟书格式，模拟器与固件 make_book.py 共用）：
  首行   = 书名行（解析时被丢弃，仅供字库生成器吸收书名字）
  '# '   = 辑（10 首一辑；目录项 / 页眉标题行用它——与道德经"卷"同构）
  '@ '   = 首编号（辑内小节分隔行，渲染层居中）
  其余行 = 句行（ASCII 起始=英文句；否则=中文句），英中逐句交替
清洗：U+200B 零宽空格删除；U+2014（em dash）→ "--"（ASCII 字库无此字形）
第 308 首维基文库缺原文：英文侧无句，只出中文占位说明行。
"""

import re
from pathlib import Path

SRC = Path(__file__).parent
EN_FILE = SRC / "stray_birds_en_wikisource.txt"
ZH_FILE = SRC / "feiniao_zh_ai.txt"
DEST = SRC / "feiniao.txt"
POEMS_PER_JI = 10                       # 10 首一辑


def parse_poems(path: Path) -> dict:
    """{首号: [句, ...]}；英文顺手做字符清洗"""
    poems, cur = {}, None
    for raw in path.read_text(encoding="utf-8").splitlines():
        line = raw.strip()
        if not line:
            continue
        if re.fullmatch(r"\d+", line):
            cur = int(line)
            assert cur not in poems, f"{path.name} 编号 {cur} 重复"
            poems[cur] = []
        else:
            assert cur is not None, f"{path.name} 首行不是编号：{line[:30]}"
            if "wikisource" in path.name:
                line = line.replace("​", "").replace("—", "--")
            poems[cur].append(line)
    return poems


def range_name(lo: int, hi: int, unit: str) -> str:
    """章名 = 范围式（2026-08-29 用户拍板）：第1-10首 / 第321-326首；单首=第308首"""
    return f"第{lo}{unit}" if lo == hi else f"第{lo}-{hi}{unit}"


def main():
    en = parse_poems(EN_FILE)
    zh = parse_poems(ZH_FILE)
    assert set(en) == set(zh) == set(range(1, 327)), "两侧编号必须都是 1-326"

    out = ["《飞鸟集》 泰戈尔 / 维基文库英文原版 + 墨舟中译", ""]
    n_ji = (326 + POEMS_PER_JI - 1) // POEMS_PER_JI
    for ji in range(n_ji):
        lo, hi = ji * POEMS_PER_JI + 1, min((ji + 1) * POEMS_PER_JI, 326)
        out.append(f"# {range_name(lo, hi, '首')}")
        for no in range(lo, hi + 1):
            out.append(f"@ {no}")
            for e, z in zip_longest(en[no], zh[no]):
                if e:
                    out.append(e)
                if z:
                    out.append(z)
        out.append("")

    DEST.write_text("\n".join(out), encoding="utf-8")
    n_en = sum(len(v) for v in en.values())
    n_zh = sum(len(v) for v in zh.values())
    print(f"[OK] {DEST}：{n_ji} 辑 × {POEMS_PER_JI} 首，326 首（英 {n_en} 句 / 中 {n_zh} 句）")


from itertools import zip_longest

if __name__ == "__main__":
    main()
