#!/usr/bin/env python3
"""The game's fonts, cut down to the characters it writes (config/lang.yaml):  python3 tools/fonts.py <Lato-Bold.ttf> <cjk.ttf> <korean.ttf>
ui.ttf: Lato Bold (OFL), Latin + Cyrillic.  cjk.ttf: Noto Sans SC (OFL), Japanese + Chinese.  ko.ttf: Noto Sans KR (OFL)."""
import os, re, sys
from fontTools import subset
from fontTools.ttLib import TTFont

root = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')
text = open(os.path.join(root, 'config', 'lang.yaml'), encoding='utf-8').read()
blocks = dict(re.findall(r'^(\w\w):\n((?:  .*\n)+)', text, re.M))
basic = ''.join(chr(c) for c in range(32, 127)) + '‹›…'


def cut(src, dst, chars):
    opt = subset.Options()
    opt.layout_features = ['kern']
    opt.name_IDs = [1, 2]
    opt.notdef_outline = True
    font = TTFont(src)
    if 'fvar' in font:   # a variable font: its bold instance
        from fontTools.varLib import instancer
        font = instancer.instantiateVariableFont(font, {'wght': 700})
    cmap = font.getBestCmap()
    missing = sorted(set(c for c in chars if ord(c) not in cmap and c.strip()))
    s = subset.Subsetter(opt)
    s.populate(text=chars)
    s.subset(font)
    font.save(os.path.join(root, 'assets', 'fonts', dst))
    print(dst, os.path.getsize(os.path.join(root, 'assets', 'fonts', dst)), 'bytes', 'MISSING: ' + ''.join(missing) if missing else '')


latin = ''.join(v for k, v in blocks.items() if k not in ('ja', 'zh', 'ko'))
cut(sys.argv[1], 'ui.ttf', basic + latin + ''.join(chr(c) for c in list(range(0xA0, 0x180)) + list(range(0x400, 0x460)) + [0x490, 0x491]))
cut(sys.argv[2], 'cjk.ttf', basic + blocks['ja'] + blocks['zh'])
cut(sys.argv[3], 'ko.ttf', basic + blocks['ko'])
