from __future__ import annotations

import re

RU_LETTER_NAMES = {
    "А": "аа",
    "Б": "бэ",
    "В": "вэ",
    "Г": "гэ",
    "Д": "дэ",
    "Е": "ее",
    "Ё": "ё",
    "Ж": "жэ",
    "З": "зэ",
    "И": "ии",
    "Й": "й",
    "К": "ка",
    "Л": "эл",
    "М": "эм",
    "Н": "эн",
    "О": "оо",
    "П": "пэ",
    "Р": "эр",
    "С": "эс",
    "Т": "тэ",
    "У": "уу",
    "Ф": "эф",
    "Х": "ха",
    "Ц": "цэ",
    "Ч": "чэ",
    "Ш": "шэ",
    "Щ": "ща",
    "Ъ": "",
    "Ы": "ыы",
    "Ь": "",
    "Э": "ээ",
    "Ю": "юю",
    "Я": "яя",
}

EN_LETTER_NAMES = {
    "A": "эй",
    "B": "би",
    "C": "си",
    "D": "ди",
    "E": "ии",
    "F": "эф",
    "G": "джи",
    "H": "эйч",
    "I": "ай",
    "J": "джей",
    "K": "кей",
    "L": "эл",
    "M": "эм",
    "N": "эн",
    "O": "оу",
    "P": "пи",
    "Q": "кью",
    "R": "ар",
    "S": "эс",
    "T": "ти",
    "U": "юю",
    "V": "ви",
    "W": "дабел ю",
    "X": "экс",
    "Y": "уай",
    "Z": "зи",
}

KNOWN_ABBREVIATIONS = {
    "ЛСД": "лсд",
    "СПИД": "спид",
    "ВИЧ": "вич",
    "ВУЗ": "вуз",
    "СУЗ": "суз",
    "НАТО": "нато",
    "ЮНЕСКО": "юнеско",
    "ОПЕК": "опек",
    "ФИФА": "фифа",
    "УЕФА": "уефа",
    "НАСА": "наса",
    "РОСКОСМОС": "роскосмос",
    "МАГАТЭ": "магатэ",
    "ОМОН": "омон",
    "СОБР": "собр",
    "ЗАГС": "загс",
    "СМИ": "сми",
    "ГОСТ": "гост",
    "МХАТ": "мхат",
    "ЕГЭ": "егэ",
    "ОГЭ": "огэ",
    "ГИБДД": "ги бэ дэ дэ",
    "ТАСС": "тасс",
    "КАМАЗ": "камаз",
    "ВАЗ": "ваз",
    "ГАЗ": "газ",
    "УАЗ": "уаз",
    "ЗИЛ": "зил",
    "КРАЗ": "краз",
    "МАЗ": "маз",
    "БЕЛАЗ": "белаз",
    "ЛУАЗ": "луаз",
    "WI-FI": "вайф+ай",
    "WIFI": "вайф+ай",
    "VIP": "ви ай пи",
    "PS": "пост скр+иптум",
    "SOS": "сос",
    "IT": "ай ти",
    "TV": "ти ви",
    "СССР": "эс эс эс эр",
    "COVID": "ковид",
    "НЕТ": "нет",
    "ДА": "да",
    "МИД": "мид",
    "США": "сэ шэ аа",
    "РФ": "эр эф",
    "ООН": "о он",
    "ВВП": "вэ вэ пэ",
    "ЧС": "че эс",
    "МЧС": "эм че эс",
    "ФСБ": "эф эс бэ",
    "МВД": "эм вэ дэ",
    "ГРУ": "гэ рэ у",
    "ДНК": "дэ эн ка",
    "ЖКХ": "же кэ ха",
    "ТЭС": "тэс",
    "ГЭС": "гэс",
    "АЭС": "аэс",
    "ВЦИОМ": "вци+ом",
    "КПСС": "ка пэ эс эс",
    "ВЛКСМ": "вэ эл ка эс эм",
    "ЦК": "цэ ка",
    "РСФСР": "эр эс эф эс эр",
    "УССР": "у эс эс эр",
    "БССР": "бэ эс эс эр",
    "СНГ": "эс эн гэ",
    "ЕЭС": "е ээ эс",
    "ЕС": "е эс",
    "ВОЗ": "воз",
    "МОК": "мок",
    "НХЛ": "эн ха эл",
    "НБА": "эн бэ аа",
    "МВФ": "эм вэ эф",
    "ВТО": "вэ тэ оо",
    "ДПС": "дэ пэ эс",
    "ППС": "пэ пэ эс",
    "УФСИН": "уфсин",
    "ФСИН": "фсин",
    "МФЦ": "эм эф цэ",
    "ПФР": "пэ фэ эр",
    "ФНС": "эф эн эс",
    "ФАС": "фас",
    "ЦБ": "цэ бэ",
    "РЖД": "эр же дэ",
    "АЗС": "а зэ эс",
    "ТЦ": "тэ цэ",
    "ТРЦ": "тэ эр цэ",
    "БЦ": "бэ цэ",
    "ЖК": "же ка",
    "ТСЖ": "тэ сэ жэ",
    "СНТ": "эс эн тэ",
    "ОАО": "оо аа оо",
    "ЗАО": "зз аа оо",
    "ООО": "оо оо оо",
    "ИП": "и пэ",
    "ГБУ": "гэ бэ у",
    "МБУ": "эм бэ у",
    "ФГБУ": "эф гэ бэ у",
    "НИИ": "ни и",
    "ПТУ": "пэ тэ у",
    "ВПР": "вэ пэ эр",
    "ГТО": "гэ тэ о",
    "КВН": "ка вэ эн",
    "ЧП": "че пэ",
    "ДТП": "дэ тэ пэ",
    "ТВ": "тэ вэ",
    "NB": "эн би",
    "SMS": "эс эм эс",
    "SIM": "сим",
    "PIN": "пин",
    "PUK": "пак",
    "ID": "ай ди",
    "USB": "ю эс би",
    "CD": "си ди",
    "DVD": "ди ви ди",
    "GPS": "джи пи эс",
    "ОРВИ": "оэрв+и",
    "ОРЗ": "оо эр зэ",
    "МРОТ": "мрот",
    "СНИЛС": "снилс",
    "АВТОВАЗ": "автоваз",
}

RU_VOWELS = set("АЕЁИОУЫЭЮЯ")
ABBREV_MIN_LEN = 2
ABBREV_MAX_LEN_RU = 5
ABBREV_MAX_LEN_EN = 5
REAL_WORD_POS = frozenset(
    {
        "NOUN",
        "VERB",
        "ADJF",
        "ADJS",
        "ADVB",
        "INFN",
        "PRTF",
        "PRTS",
        "GRND",
        "PREP",
        "CONJ",
        "PRCL",
        "NPRO",
    }
)

RUSSIAN_NAME_TOKEN = r"[А-ЯЁ][а-яё+]+(?:-[А-ЯЁ]?[а-яё+]+)*"
PERSON_SURNAME_INITIALS_PATTERN = re.compile(
    rf"(?<![A-Za-zА-Яа-яЁё])(?P<surname>{RUSSIAN_NAME_TOKEN})\s+"
    r"(?P<i1>[А-ЯЁ])\.\s*(?P<i2>[А-ЯЁ])\.(?![A-Za-zА-Яа-яЁё])"
)
PERSON_INITIALS_SURNAME_PATTERN = re.compile(
    rf"(?<![A-Za-zА-Яа-яЁё])(?P<i1>[А-ЯЁ])\.\s*(?P<i2>[А-ЯЁ])\.\s+"
    rf"(?P<surname>{RUSSIAN_NAME_TOKEN})(?![A-Za-zА-Яа-яЁё])"
)
PERSON_SURNAME_SINGLE_INITIAL_PATTERN = re.compile(
    rf"(?<![A-Za-zА-Яа-яЁё])(?P<surname>{RUSSIAN_NAME_TOKEN})\s+"
    r"(?P<i1>[А-ЯЁ])\.(?![A-Za-zА-Яа-яЁё])"
)
PERSON_SINGLE_INITIAL_SURNAME_PATTERN = re.compile(
    rf"(?<![A-Za-zА-Яа-яЁё])(?P<i1>[А-ЯЁ])\.\s+"
    rf"(?P<surname>{RUSSIAN_NAME_TOKEN})(?![A-Za-zА-Яа-яЁё])"
)

ABBREV_DOTTED_PATTERN = re.compile(
    r"(?<![A-Za-zА-ЯЁ])(?:[A-ZА-ЯЁ]\.){2,}[A-ZА-ЯЁ]?\.?(?![A-Za-zА-ЯЁ])"
)
ABBREV_SOLID_PATTERN = re.compile(r"(?<![A-Za-zА-ЯЁ])[A-ZА-ЯЁ]{2,}(?![A-Za-zА-ЯЁ])")

UNICODE_FRACTIONS = {
    "¼": "1/4",
    "½": "1/2",
    "¾": "3/4",
    "⅓": "1/3",
    "⅔": "2/3",
    "⅛": "1/8",
    "⅜": "3/8",
    "⅝": "5/8",
    "⅞": "7/8",
}

CLEANUP_REPLACEMENTS = [
    ("--", "—"),
    (",,", ","),
    (".\n", ". \n"),
    ("©", "."),
    ("®", ""),
    ("™", ""),
    ("−", "-"),
    ("–", "—"),
    ("\u2010", "-"),
    ("\u2011", "-"),
    ("\u2212", "-"),
    ("-", "-"),
    ("\u00a0", " "),
    ("\u202f", " "),
    ("\u2003", " "),
    ("\u2002", " "),
    ("\u2007", " "),
    ("\u2008", " "),
    ("\u2009", " "),
    ("\t", " "),
]
