#!/usr/bin/env python3.11
# -*- coding: utf-8 -*-
"""
check_fonts_old_ru.py

Проверяет все установленные на сервере шрифты (.ttf/.otf) на наличие
глифов, нужных для дореформенной орфографии: ѣ/Ѣ, ѳ/Ѳ, і/І, ѵ/Ѵ
(плюс на всякий случай обычный набор кириллицы и латиницы).

Нужен пакет fontTools:
    python3.11 -m pip install fonttools --break-system-packages
"""

import os

try:
    from fontTools.ttLib import TTFont
except ImportError:
    print("Не установлен пакет fontTools. Установите командой:")
    print("  python3.11 -m pip install fonttools --break-system-packages")
    raise SystemExit(1)

# Буквы, без которых дообучение бессмысленно
REQUIRED_CHARS = {
    "ѣ (yat)": "\u0463",
    "Ѣ (Yat)": "\u0462",
    "ѳ (fita)": "\u0473",
    "Ѳ (Fita)": "\u0472",
    "і (i decimal)": "\u0456",
    "І (I decimal)": "\u0406",
    "ѵ (izhitsa)": "\u0475",
    "Ѵ (Izhitsa)": "\u0474",
}

# Базовые буквы для проверки (должны быть у любого нормального кириллического шрифта)
SANITY_CHARS = {
    "а": "\u0430",
    "я": "\u044F",
    "ъ": "\u044A",
}

FONT_DIRS = [
    "/usr/share/fonts",
    "/usr/local/share/fonts",
    os.path.expanduser("~/.fonts"),
    os.path.expanduser("~/.local/share/fonts"),
]


def find_font_files():
    paths = []
    for base in FONT_DIRS:
        if not os.path.isdir(base):
            continue
        for root, _, files in os.walk(base):
            for fn in files:
                if fn.lower().endswith((".ttf", ".otf", ".ttc")):
                    paths.append(os.path.join(root, fn))
    return sorted(set(paths))


def get_cmap_chars(font_path):
    """Возвращает множество кодпоинтов, которые шрифт умеет отображать."""
    chars = set()
    try:
        font = TTFont(font_path, fontNumber=0, lazy=True)
        for table in font["cmap"].tables:
            chars.update(table.cmap.keys())
    except Exception:
        return None
    return chars


def main():
    font_files = find_font_files()
    print(f"Найдено файлов шрифтов: {len(font_files)}\n")

    if not font_files:
        print("Шрифты не найдены в стандартных папках. Возможно, потребуется их установить -")
        print("например: sudo yum install google-noto-serif-fonts dejavu-serif-fonts")
        return

    full_support = []
    partial_support = []

    for path in font_files:
        cmap = get_cmap_chars(path)
        if cmap is None:
            continue

        sanity_ok = all(ord(ch) in cmap for ch in SANITY_CHARS.values())
        if not sanity_ok:
            continue  # не кириллический шрифт вообще - пропускаем

        found = {name: (ord(ch) in cmap) for name, ch in REQUIRED_CHARS.items()}
        count_found = sum(found.values())

        if count_found == len(REQUIRED_CHARS):
            full_support.append(path)
        elif count_found > 0:
            partial_support.append((path, found))

    print("===== Шрифты С ПОЛНОЙ поддержкой ѣ/ѳ/і/ѵ (кандидаты для генерации обучающих изображений) =====")
    if full_support:
        for p in full_support:
            print(" ", p)
    else:
        print("  (не найдено)")

    print("\n===== Шрифты с ЧАСТИЧНОЙ поддержкой (не хватает некоторых букв) =====")
    if partial_support:
        for p, found in partial_support[:20]:
            missing = [name for name, ok in found.items() if not ok]
            print(f"  {p}")
            print(f"    отсутствуют: {', '.join(missing)}")
    else:
        print("  (не найдено)")

    print(f"\nВсего кириллических шрифтов проверено: {len(full_support) + len(partial_support)}")


if __name__ == "__main__":
    main()
