# -*- coding: utf-8 -*-
"""build_pdf.py —— 一键构建教程 PDF。

流程：
  1) 合并 tutorial/ 各章 → book.md
  2) 修复中文引号（code/fix_quotes.py）
  3) pandoc → build.tex（ctexbook，含封面/目录）
  4) xelatex 两遍 → build.pdf
  5) 重命名为正式书名，清理中间文件

用法：
  python code/build_pdf.py            # 全流程
  python code/build_pdf.py --tex      # 只生成 book.md 与 build.tex（调试）
"""
import os
import shutil
import subprocess
import sys

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PANDOC = r"D:\Users\Kael\anaconda3\Library\bin\pandoc.exe"
XELATEX = r"C:\Progra~1\MiKTeX\miktex\bin\x64\xelatex.exe"
BOOK_NAME = "空间生态位与细胞通讯重编程——肿瘤微环境空间转录组分析实战教程.pdf"


def run(cmd, cwd=ROOT):
    print(">>", " ".join(cmd) if isinstance(cmd, list) else cmd)
    r = subprocess.run(cmd, cwd=cwd, shell=True)
    if r.returncode != 0:
        print(f"!! 命令失败（exit {r.returncode}）")
        sys.exit(1)


def main():
    only_tex = "--tex" in sys.argv

    # 0. 确保输出目录存在（build/ 为中间产物目录，可随时删除重建）
    os.makedirs(os.path.join(ROOT, "build"), exist_ok=True)

    # 1. 合并
    run(f'"{sys.executable}" code/merge_book.py')
    # 2. 引号修复
    run(f'"{sys.executable}" code/fix_quotes.py')

    if only_tex:
        build_tex()
        print("已生成 book.md 与 build/build.tex，可手动跑 xelatex 调试。")
        return

    build_tex()
    # 4. xelatex 两遍（生成目录页码）
    run(f'cd /d "{ROOT}" && "{XELATEX}" -interaction=nonstopmode build\\build.tex')
    run(f'cd /d "{ROOT}" && "{XELATEX}" -interaction=nonstopmode build\\build.tex')

    # 5. 重命名并清理
    src = os.path.join(ROOT, "build", "build.pdf")
    dst = os.path.join(ROOT, BOOK_NAME)
    if os.path.exists(src):
        shutil.move(src, dst)
        print(f"✅ PDF 已生成：{dst}（{os.path.getsize(dst)/1024/1024:.1f} MB）")
    else:
        print("!! 未找到 build/build.pdf，请查看 build/build.log 排错")
        sys.exit(1)


def build_tex():
    cmd = (f'cd /d "{ROOT}" && "{PANDOC}" book.md -o build\\build.tex '
           '-V documentclass=ctexbook -V classoption="11pt,openany" '
           '-V colorlinks=true --toc --toc-depth=2 '
           '-H preamble.tex --syntax-highlighting=tango --metadata lang=zh-CN')
    run(cmd)


if __name__ == "__main__":
    main()
