#!/usr/bin/env python3
"""Собирает шрифты для OG-картинок: latin + cyrillic в один ttf.

Зачем: satori не переключается между шрифтами с одинаковым name по наличию глифа.
Fontsource отдаёт latin и cyrillic раздельными файлами, поэтому при прямой подаче
половина заголовка рендерится как NO GLYPH. Здесь они сливаются в один файл.

Запускать после обновления @fontsource/*:
    uv run python scripts/build_og_fonts.py
"""
from __future__ import annotations

import os
from pathlib import Path

from fontTools.merge import Merger
from fontTools.ttLib import TTFont

ROOT = Path(__file__).resolve().parent.parent
OUT_DIR = ROOT / "src" / "assets" / "fonts"

TARGETS = [
    ("og-display.ttf", "@fontsource/unbounded", ["unbounded-latin-600-normal.woff", "unbounded-cyrillic-600-normal.woff"]),
    ("og-body.ttf", "@fontsource/inter", ["inter-latin-400-normal.woff", "inter-cyrillic-400-normal.woff"]),
]


def main() -> int:
    OUT_DIR.mkdir(parents=True, exist_ok=True)
    tmp: list[Path] = []
    for out_name, pkg, files in TARGETS:
        ttfs: list[str] = []
        for name in files:
            src = ROOT / "node_modules" / pkg / "files" / name
            if not src.exists():
                raise SystemExit(f"нет файла шрифта: {src}")
            font = TTFont(src)
            font.flavor = None  # woff -> ttf
            dst = ROOT / name.replace(".woff", ".ttf")
            font.save(dst)
            ttfs.append(str(dst))
            tmp.append(dst)
        merged = Merger().merge(ttfs)
        target = OUT_DIR / out_name
        merged.save(target)
        print(f"ok {out_name}  {os.path.getsize(target) // 1024} KB")
    for path in tmp:
        path.unlink(missing_ok=True)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
