"""Reproduce the renamed, static OFL font; requires fontTools 4.29.1.
Source is pinned; generated data is never based on user text.
"""
import hashlib
import json
import sys
from pathlib import Path
from urllib.request import urlopen
from fontTools.ttLib import TTFont
from fontTools.varLib.instancer import instantiateVariableFont

revision = "f8d157532fbfaeda587e826d4cd5b21a49186f7c"
url = f"https://raw.githubusercontent.com/notofonts/noto-cjk/{revision}/Sans/Variable/TTF/Subset/NotoSansTC-VF.ttf"
expected = "ac091cc8cd19e848202afc8fe6d3809b4526c8fdbdb4be82da20c4f785949591"
source = Path(sys.argv[1] if len(sys.argv) > 1 else "/tmp/sign-noto-source.ttf")
if not source.exists():
    source.write_bytes(urlopen(url).read())
assert hashlib.sha256(source.read_bytes()).hexdigest() == expected
font = instantiateVariableFont(TTFont(source), {"wght": 400}, inplace=True)
font.recalcTimestamp = False
for record in font["name"].names:
    if record.nameID in (1, 4, 6, 16, 21):
        record.string = ("FormatPleaseUnicode-Regular" if record.nameID == 6 else "FormatPlease Unicode").encode(record.getEncoding())
    elif record.nameID in (2, 17, 22):
        record.string = "Regular".encode(record.getEncoding())
destination = Path("public/sign-assets/FormatPleaseUnicode-Regular.ttf")
destination.parent.mkdir(parents=True, exist_ok=True)
font.save(destination)
data = destination.read_bytes()
manifest = {"family": "FormatPlease Unicode", "sourceFamily": "Noto Sans TC", "revision": revision,
    "source": url, "sourceSha256": expected, "license": "OFL-1.1",
    "recipe": "fontTools 4.29.1: instantiate wght=400, rename family and PostScript names; preserve original character coverage and copyright/license records",
    "path": "/sign-assets/FormatPleaseUnicode-Regular.ttf", "bytes": len(data),
    "sha256": hashlib.sha256(data).hexdigest(), "characters": len(font.getBestCmap()),
    "copyright": font["name"].getDebugName(0),
    "recipeSha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),
    "licenseSha256": hashlib.sha256(Path("third_party/pdf-sign-font/OFL.txt").read_bytes()).hexdigest()}
Path("third_party/pdf-sign-font/manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n")
print(json.dumps(manifest, ensure_ascii=False))
