from __future__ import annotations

import re
from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class RegexRule:
    pattern: str
    flags: int = re.IGNORECASE


def rx(pattern: str, flags: int = re.IGNORECASE) -> RegexRule:
    return RegexRule(pattern=pattern, flags=flags)


ABBREVIATION_RULES = {
    rx(r"\bсм\.\s*рис\.(?!\w)"): "смотри рисунок",
    rx(r"\bсм\."): "смотри",
    rx(r"\bнапр\."): "например",
    rx(r"\bт\.?\s*е\."): "то есть",
    rx(r"\bт\.?\s*к\."): "так как",
    rx(r"(?<!\w)н\.?\s*э\.(?!\w)"): "нашей эры",
    rx(r"(?<!\w)нэ\.?(?!\w)"): "нашей эры",
    rx(r"\bс\.\s*(?=\d)"): "страница ",
    rx(r"\bp\.\s*(?=\d)"): "страница ",
    rx(r"\bст\.\s*(?=\d)"): "статья ",
    rx(r"\bгл\."): "глава",
    rx(r"\bmr\."): "мистер",
    rx(r"\bmrs\."): "миссис",
    rx(r"\bг-?н\.?\b"): "господин",
    rx(r"\bг-?жа\.?\b"): "госпожа",
    rx(r"\bСв\.\s+(?=[А-ЯЁ][а-яё]+(?:а|я)\b)", 0): "Святого ",
    rx(r"\bсв\.\s+(?=[А-ЯЁ][а-яё]+(?:а|я)\b)"): "святого ",
    rx(r"\bрис\.\s*(?=\d)"): "рисунок ",
    # rx(r"\bим\."): "имени",
    rx(r"\bул\.\s*(?=[А-ЯЁ])"): "улица ",
    "снск.": "сноска",
    "прим. пер.": "примечание переводчика",
    "прим.пер.": "примечание переводчика",
    "прим. перев.": "примечание переводчика",
    "прим.перев.": "примечание переводчика",
    "прим. ред.": "примечание редактора",
    "прим.ред.": "примечание редактора",
    rx(r"\bперев\."): "переводчик",
    "изд-во": "издательство",
    "ин-т": "институт",
    "инф-ция": "информация",
    "орг-ция": "организация",
    "мин-во": "министерство",
    "гос-во": "государство",
    "гос.": "государственный",
    "междунар.": "международный",
    "обл.": "область",
    "р-н": "район",
    "пос.": "посёлок",
    "пгт": "посёлок городского типа",
    "оз.": "озеро",
    "полит.": "политический",
    "офиц.": "официальный",
    "юридич.": "юридический",
    "ж.-д.": "железнодорожный",
    "с.-х.": "сельскохозяйственный",
    "штаб-кв.": "штаб-квартира",
    "т.д.": "так далее",
    "т. д.": "так далее",
    "т.п.": "тому подобное",
    "т. п.": "тому подобное",
    "табл.": "таблица",
    "стр.": "страница",
    "ред.": "редактор",
    "сост.": "составитель",
    "прил.": "приложение",
    "прим. авт.": "примечание автора",
    "прим.": "примечание",
    "УК РФ": "уголовный кодекс российской федерации",
    "АК РФ": "арбитражный кодекс российской федерации",
    "псевд.": "псевдоним",
    "респ.": "республика",
}

ADJECTIVE_ABBREVIATION_EXPANSIONS = {
    "англ.": "английский",
    "руск.": "русский",
    "рус.": "русский",
    "немецк.": "немецкий",
    "нем.": "немецкий",
    "франц.": "французский",
    "греч.": "греческий",
    "латин.": "латинский",
    "лат.": "латинский",
    "гос.": "государственный",
    "междунар.": "международный",
    "полит.": "политический",
    "офиц.": "официальный",
    "юридич.": "юридический",
    "ж.-д.": "железнодорожный",
    "с.-х.": "сельскохозяйственный",
}


def _compile_literal_rule(abbr: str) -> re.Pattern[str]:
    return re.compile(rf"(?<!\w){re.escape(abbr)}(?!\w)", re.IGNORECASE)


ABBREVIATION_PATTERNS = [
    (
        (
            re.compile(matcher.pattern, matcher.flags)
            if isinstance(matcher, RegexRule)
            else _compile_literal_rule(matcher)
        ),
        replacement,
    )
    for matcher, replacement in ABBREVIATION_RULES.items()
]
