from __future__ import annotations


class KeyTermCanonicalizer:
    _ALIASES: dict[str, set[str]] = {
        "файл": {
            "файл",
            "файла",
            "файле",
            "файлу",
            "файлом",
            "файлы",
            "файлов",
            "файлам",
            "файлами",
        },
        "класс": {"класс", "класса", "классе", "классу", "классом", "классы", "классов", "классам"},
        "функция": {"функция", "функции", "функцию", "функцией", "функциях"},
        "метод": {"метод", "метода", "методе", "методу", "методом", "методы"},
        "документация": {"документация", "документации", "документацию"},
        "тест": {"тест", "тесты", "тестов", "тестам", "тестами", "юнит-тест", "юниттест"},
        "модуль": {"модуль", "модуля"},
        "пакет": {"пакет"},
    }

    def __init__(self) -> None:
        self._token_to_canonical = self._build_index()

    def canonicalize(self, token: str) -> str | None:
        return self._token_to_canonical.get((token or "").lower())

    def aliases(self) -> set[str]:
        values: set[str] = set()
        for forms in self._ALIASES.values():
            values.update(forms)
        return values

    def is_test_term(self, token: str) -> bool:
        canonical = self.canonicalize(token)
        return canonical == "тест"

    def _build_index(self) -> dict[str, str]:
        index: dict[str, str] = {}
        for canonical, forms in self._ALIASES.items():
            index[canonical] = canonical
            for form in forms:
                index[form] = canonical
        return index
