from __future__ import annotations

import re

POST_NUMERAL_ABBREVIATION_PATTERNS = [
    (re.compile(r"(?<!\w)тыс\.(?!\w)", re.IGNORECASE), "тысяч"),
    (re.compile(r"(?<!\w)млн\.(?!\w)", re.IGNORECASE), "миллионов"),
    (re.compile(r"(?<!\w)млрд\.(?!\w)", re.IGNORECASE), "миллиардов"),
    (re.compile(r"(?<!\w)трлн\.(?!\w)", re.IGNORECASE), "триллионов"),
    (re.compile(r"(?<!\w)руб\.(?!\w)", re.IGNORECASE), "рублей"),
    (re.compile(r"(?<!\w)долл\.(?!\w)", re.IGNORECASE), "долларов"),
    (re.compile(r"(?<!\w)дол\.(?!\w)", re.IGNORECASE), "долларов"),
    (re.compile(r"(?<!\w)и\s+др\.(?!\w)", re.IGNORECASE), "и другие"),
]

GREEK_LETTERS = {
    "α": "альфа",
    "β": "бета",
    "γ": "гамма",
    "δ": "дельта",
    "ε": "эпсилон",
    "ϵ": "эпсилон",
    "ζ": "дзета",
    "η": "эта",
    "θ": "тета",
    "ϑ": "тета",
    "ι": "йота",
    "κ": "каппа",
    "ϰ": "каппа",
    "λ": "лямбда",
    "μ": "мю",
    "µ": "мю",
    "ν": "ню",
    "ξ": "кси",
    "ο": "омикрон",
    "π": "пи",
    "ϖ": "пи",
    "ρ": "ро",
    "ϱ": "ро",
    "σ": "сигма",
    "ς": "сигма",
    "τ": "тау",
    "φ": "фи",
    "ϕ": "фи",
    "χ": "хи",
    "ψ": "пси",
    "ω": "омега",
    "Δ": "дельта",
    "Σ": "сигма",
    "Ω": "омега",
    "Π": "пи",
    "Φ": "фи",
    "Γ": "гамма",
    "Λ": "лямбда",
    "Θ": "тета",
}

MATH_SYMBOLS = {
    "×": " умножить на ",
    "÷": " разделить на ",
    "±": " плюс-минус ",
    "∓": " минус-плюс ",
    "≈": " приблизительно равно ",
    "≠": " не равно ",
    "≤": " меньше или равно ",
    "≥": " больше или равно ",
    "∞": " бесконечность ",
    "√": " корень из ",
    "∑": " сумма ",
    "∏": " произведение ",
    "∫": " интеграл ",
    "∂": " дель ",
    "∈": " принадлежит ",
    "∉": " не принадлежит ",
    "∪": " объединение ",
    "∩": " пересечение ",
    "⇒": " следует ",
    "№": " номер ",
}

CURRENCY_STANDALONE = {
    "$": "доллар",
    "€": "евро",
    "£": "фунт",
    "¥": "йена",
    "₽": "рубль",
    "₴": "гривна",
    "₸": "тенге",
    "₺": "лира",
    "₹": "рупия",
    "¢": "цент",
}

PREP_CASE = {
    "в": "accs",
    "о": "loct",
    "об": "loct",
    "на": "accs",
    "за": "accs",
    "из": "gent",
    "с": "gent",
    "к": "datv",
    "по": "datv",
    "для": "gent",
    "без": "gent",
    "при": "loct",
    "между": "ablt",
    "до": "gent",
    "от": "gent",
    "у": "gent",
    "во": "accs",
    "со": "gent",
    "ко": "datv",
    "обо": "loct",
    "около": "gent",
    "порядка": "gent",
    "не более": "gent",
    "не менее": "gent",
    "не больше": "gent",
    "не меньше": "gent",
    "более": "gent",
    "больше": "gent",
    "менее": "gent",
    "меньше": "gent",
    "свыше": "gent",
    "после": "gent",
    "против": "gent",
    "среди": "gent",
    "вместо": "gent",
    "возле": "gent",
    "вокруг": "gent",
    "внутри": "gent",
    "вне": "gent",
    "ради": "gent",
    "в течение": "gent",
    "течение": "gent",
    "в продолжение": "gent",
    "из-за": "gent",
    "из-под": "gent",
    "вблизи": "gent",
    "вроде": "gent",
    "наподобие": "gent",
    "касательно": "gent",
    "относительно": "gent",
    "насчет": "gent",
    "по поводу": "gent",
    "по причине": "gent",
    "ввиду": "gent",
    "в силу": "gent",
    "в целях": "gent",
    "в рамках": "gent",
    "в ходе": "gent",
    "в отсутствие": "gent",
    "во избежание": "gent",
    "по истечении": "gent",
    "исходя из": "gent",
    "независимо от": "gent",
    "в отличие от": "gent",
    "в зависимости от": "gent",
    "вследствие": "gent",
    "через": "accs",
    "вдоль": "gent",
    "благодаря": "datv",
    "вопреки": "datv",
    "согласно": "datv",
    "навстречу": "datv",
    "подобно": "datv",
    "сообразно": "datv",
    "применительно к": "datv",
    "по направлению к": "datv",
    "по мере": "gent",
    "над": "ablt",
    "надо": "ablt",
    "перед": "ablt",
    "передо": "ablt",
    "пред": "ablt",
    "меж": "ablt",
    "в связи с": "ablt",
    "рядом с": "ablt",
    "вместе с": "ablt",
    "наряду с": "ablt",
    "старше": "gent",
    "моложе": "gent",
    "младше": "gent",
    "выше": "gent",
    "ниже": "gent",
    "дольше": "gent",
    "короче": "gent",
}

VERB_CASE = {
    "обнаружить": "accs",
    "выявить": "accs",
    "показать": "accs",
    "считать": "accs",
    "оценить": "accs",
    "иметь": "accs",
    "избегать": "gent",
    "опасаться": "gent",
    "достичь": "gent",
    "достигать": "gent",
    "лишиться": "gent",
    "верить": "datv",
    "доверять": "datv",
    "видеть": "accs",
    "наблюдать": "accs",
    "замечать": "accs",
    "осознавать": "accs",
    "понимать": "accs",
    "изучать": "accs",
    "анализировать": "accs",
    "рассматривать": "accs",
    "определять": "accs",
    "устанавливать": "accs",
    "формировать": "accs",
    "использовать": "accs",
    "применять": "accs",
    "реализовывать": "accs",
    "разрабатывать": "accs",
    "создавать": "accs",
    "включать": "accs",
    "получать": "accs",
    "не иметь": "gent",
    "избежать": "gent",
    "достигнуть": "gent",
    "требовать": "gent",
    "ожидать": "gent",
    "бояться": "gent",
    "страшиться": "gent",
    "лишать": "gent",
    "касаться": "gent",
    "относиться": "gent",
    "состоять": "gent",
    "дожидаться": "gent",
    "избавиться": "gent",
    "помогать": "datv",
    "способствовать": "datv",
    "препятствовать": "datv",
    "следовать": "datv",
    "соответствовать": "datv",
    "противоречить": "datv",
    "удивляться": "datv",
    "радоваться": "datv",
    "завидовать": "datv",
    "угрожать": "datv",
    "рекомендовать": "datv",
    "предлагать": "datv",
    "являться": "ablt",
    "считаться": "ablt",
    "обладать": "ablt",
    "характеризоваться": "ablt",
    "отличаться": "ablt",
    "определяться": "ablt",
    "пользоваться": "ablt",
    "управлять": "ablt",
    "владеть": "ablt",
    "говорить": "loct",
    "сообщать": "loct",
    "рассказывать": "loct",
    "упоминать": "loct",
    "писать": "loct",
    "думать": "loct",
    "размышлять": "loct",
    "основываться": "loct",
    "заключаться": "loct",
}

UNITS_DATA = {
    "₽": ("рубль", "masc", "money"),
    "р": ("рубль", "masc", "money"),
    "руб": ("рубль", "masc", "money"),
    "руб.": ("рубль", "masc", "money"),
    "рубль": ("рубль", "masc", "money"),
    "$": ("доллар", "masc", "money"),
    "¢": ("цент", "masc", "money"),
    "доллар": ("доллар", "masc", "money"),
    "долл.": ("доллар", "masc", "money"),
    "долл": ("доллар", "masc", "money"),
    "usd": ("доллар", "masc", "money"),
    "€": ("евро", "masc", "money"),
    "eur": ("евро", "masc", "money"),
    "евро": ("евро", "masc", "money"),
    "£": ("фунт", "masc", "money"),
    "фунт": ("фунт", "masc", "money"),
    "¥": ("иена", "femn", "money"),
    "иена": ("иена", "femn", "money"),
    "¥н": ("юань", "masc", "money"),
    "юань": ("юань", "masc", "money"),
    "₪": ("шекель", "masc", "money"),
    "шекель": ("шекель", "masc", "money"),
    "₴": ("гривна", "femn", "money"),
    "uah": ("гривна", "femn", "money"),
    "₸": ("тенге", "masc", "money"),
    "kzt": ("тенге", "masc", "money"),
    "₺": ("лира", "femn", "money"),
    "try": ("лира", "femn", "money"),
    "₹": ("рупия", "femn", "money"),
    "inr": ("рупия", "femn", "money"),
    "₩": ("вон", "masc", "money"),
    "krw": ("вон", "masc", "money"),
    "₫": ("донг", "masc", "money"),
    "vnd": ("донг", "masc", "money"),
    "₱": ("песо", "neut", "money"),
    "₦": ("найра", "femn", "money"),
    "ngn": ("найра", "femn", "money"),
    "копейка": ("копейка", "femn", "money"),
    "коп": ("копейка", "femn", "money"),
    "коп.": ("копейка", "femn", "money"),
    "цент": ("цент", "masc", "money"),
    "%": ("процент", "masc", "percent"),
    "процент": ("процент", "masc", "percent"),
    "‰": ("промилле", "masc", "percent"),
    "‱": ("базисный пункт", "masc", "percent"),
    "п.п.": ("процентный пункт", "masc", "percent"),
    "б.п.": ("базисный пункт", "masc", "percent"),
    "bps": ("базисный пункт", "masc", "percent"),
    "°c": ("градус", "masc", "measure", "Цельсия"),
    "°k": ("градус", "masc", "measure", "Кельвина"),
    "°f": ("градус", "masc", "measure", "Фаренгейта"),
    "°С": ("градус", "masc", "measure", "Цельсия"), # russian C
    "°К": ("градус", "masc", "measure", "Кельвина"), # russian K
    "°": ("градус", "masc", "measure"),
    "градус": ("градус", "masc", "measure"),
    # "k": ("кельвин", "masc", "measure"),
    # "к": ("кельвин", "masc", "measure"),
    "кельвин": ("кельвин", "masc", "measure"),
    "v": ("вольт", "masc", "measure"),
    "в.": ("век", "masc", "measure"),
    "вольт": ("вольт", "masc", "measure"),
    "кв": ("киловольт", "masc", "measure"),
    "mv": ("милливольт", "masc", "measure"),
    "kv": ("киловольт", "masc", "measure"),
    "ma": ("миллиампер", "masc", "measure"),
    "ka": ("килоампер", "masc", "measure"),
    "ua": ("микроампер", "masc", "measure"),
    "µa": ("микроампер", "masc", "measure"),
    "μa": ("микроампер", "masc", "measure"),
    "вт": ("ватт", "masc", "measure"),
    "ватт": ("ватт", "masc", "measure"),
    "w": ("ватт", "masc", "measure"),
    "kw": ("киловатт", "masc", "measure"),
    "mw": ("мегаватт", "masc", "measure"),
    "gw": ("гигаватт", "masc", "measure"),
    "мкА": ("микроампер", "masc", "measure"),
    "мА": ("миллиампер", "masc", "measure"),
    "кА": ("килоампер", "masc", "measure"),
    "ампер": ("ампер", "masc", "measure"),
    "ω": ("ом", "masc", "measure"),
    "ом": ("ом", "masc", "measure"),
    "н": ("ньютон", "masc", "measure"),
    "n": ("ньютон", "masc", "measure"),
    "ньютон": ("ньютон", "masc", "measure"),
    "кн": ("килоньютон", "masc", "measure"),
    "kn": ("килоньютон", "masc", "measure"),
    "мн": ("меганьютон", "masc", "measure"),
    "mn": ("меганьютон", "masc", "measure"),
    "ф": ("фарад", "masc", "measure"),
    "f": ("фарад", "masc", "measure"),
    "фарад": ("фарад", "masc", "measure"),
    "мф": ("миллифарад", "masc", "measure"),
    "mf": ("миллифарад", "masc", "measure"),
    "мкф": ("микрофарад", "masc", "measure"),
    "µf": ("микрофарад", "masc", "measure"),
    "μf": ("микрофарад", "masc", "measure"),
    "uf": ("микрофарад", "masc", "measure"),
    "нф": ("нанофарад", "masc", "measure"),
    "nf": ("нанофарад", "masc", "measure"),
    "пф": ("пикофарад", "masc", "measure"),
    "pf": ("пикофарад", "masc", "measure"),
    "гн": ("генри", "masc", "measure"),
    "h": ("генри", "masc", "measure"),
    "генри": ("генри", "masc", "measure"),
    "кл": ("кулон", "masc", "measure"),
    "c": ("кулон", "masc", "measure"),
    "кулон": ("кулон", "masc", "measure"),
    "тл": ("тесла", "femn", "measure"),
    "тесла": ("тесла", "femn", "measure"),
    "вб": ("вебер", "masc", "measure"),
    "wb": ("вебер", "masc", "measure"),
    "вебер": ("вебер", "masc", "measure"),
    "лм": ("люмен", "masc", "measure"),
    "lm": ("люмен", "masc", "measure"),
    "люмен": ("люмен", "masc", "measure"),
    "лк": ("люкс", "masc", "measure"),
    "lx": ("люкс", "masc", "measure"),
    "люкс": ("люкс", "masc", "measure"),
    "бк": ("беккерель", "masc", "measure"),
    "bq": ("беккерель", "masc", "measure"),
    "беккерель": ("беккерель", "masc", "measure"),
    "gy": ("грей", "masc", "measure"),
    "грей": ("грей", "masc", "measure"),
    "зв": ("зиверт", "masc", "measure"),
    "sv": ("зиверт", "masc", "measure"),
    "зиверт": ("зиверт", "masc", "measure"),
    "дж": ("джоуль", "masc", "measure"),
    "джоуль": ("джоуль", "masc", "measure"),
    "кдж": ("килоджоуль", "masc", "measure"),
    "па": ("паскаль", "masc", "measure"),
    "паскаль": ("паскаль", "masc", "measure"),
    "мпа": ("мегапаскаль", "masc", "measure"),
    "кпа": ("килопаскаль", "masc", "measure"),
    "бар": ("бар", "masc", "measure"),
    "квт": ("киловатт", "masc", "measure"),
    "киловатт": ("киловатт", "masc", "measure"),
    "квтч": ("киловатт-час", "masc", "measure"),
    "квт.ч": ("киловатт-час", "masc", "measure"),
    "квт-ч": ("киловатт-час", "masc", "measure"),
    "мвт": ("мегаватт", "masc", "measure"),
    "гвт": ("гигаватт", "masc", "measure"),
    "гц": ("герц", "masc", "measure"),
    "герц": ("герц", "masc", "measure"),
    "кгц": ("килогерц", "masc", "measure"),
    "мгц": ("мегагерц", "masc", "measure"),
    "ггц": ("гигагерц", "masc", "measure"),
    "байт": ("байт", "masc", "measure"),
    "кб": ("килобайт", "masc", "measure"),
    "кбайт": ("килобайт", "masc", "measure"),
    "мб": ("мегабайт", "masc", "measure"),
    "мбайт": ("мегабайт", "masc", "measure"),
    "гб": ("гигабайт", "masc", "measure"),
    "гбайт": ("гигабайт", "masc", "measure"),
    "тб": ("терабайт", "masc", "measure"),
    "тбайт": ("терабайт", "masc", "measure"),
    "бит": ("бит", "masc", "measure"),
    "кбит": ("килобит", "masc", "measure"),
    "мбит": ("мегабит", "masc", "measure"),
    "гбит": ("гигабит", "masc", "measure"),
    "тбит": ("терабит", "masc", "measure"),
    "kb": ("килобайт", "masc", "measure"),
    "mb": ("мегабайт", "masc", "measure"),
    "gb": ("гигабайт", "masc", "measure"),
    "tb": ("терабайт", "masc", "measure"),
    "kbps": ("килобит", "masc", "measure", "в секунду"),
    "mbps": ("мегабит", "masc", "measure", "в секунду"),
    "gbps": ("гигабит", "masc", "measure", "в секунду"),
    "бит/с": ("бит", "masc", "measure", "в секунду"),
    "кбит/с": ("килобит", "masc", "measure", "в секунду"),
    "мбит/с": ("мегабит", "masc", "measure", "в секунду"),
    "гбит/с": ("гигабит", "masc", "measure", "в секунду"),
    "байт/с": ("байт", "masc", "measure", "в секунду"),
    "кб/с": ("килобайт", "masc", "measure", "в секунду"),
    "мб/с": ("мегабайт", "masc", "measure", "в секунду"),
    "гб/с": ("гигабайт", "masc", "measure", "в секунду"),
    "kb/s": ("килобайт", "masc", "measure", "в секунду"),
    "mb/s": ("мегабайт", "masc", "measure", "в секунду"),
    "gb/s": ("гигабайт", "masc", "measure", "в секунду"),
    "fps": ("кадр", "masc", "measure", "в секунду"),
    "га": ("гектар", "masc", "measure"),
    "гектар": ("гектар", "masc", "measure"),
    "кал": ("калория", "femn", "measure"),
    "ккал": ("килокалория", "femn", "measure"),
    "л.с.": ("лошадиная сила", "femn", "measure"),
    "л. с.": ("лошадиная сила", "femn", "measure"),
    "кг": ("килограмм", "masc", "measure"),
    "килограмм": ("килограмм", "masc", "measure"),
    "kg": ("килограмм", "masc", "measure"),
    "г": ("грамм", "masc", "measure"),
    "грамм": ("грамм", "masc", "measure"),
    "гр": ("грамм", "masc", "measure"),
    "т": ("тонна", "femn", "measure"),
    "тонна": ("тонна", "femn", "measure"),
    "мг": ("миллиграмм", "masc", "measure"),
    "мкг": ("микрограмм", "masc", "measure"),
    "нг": ("нанограмм", "masc", "measure"),
    "oz": ("унция", "femn", "measure"),
    "унция": ("унция", "femn", "measure"),
    "lb": ("фунт", "masc", "measure"),
    "м": ("метр", "masc", "measure"),
    "нм.": ("нанометр", "masc", "measure"),
    "нм": ("нанометр", "masc", "measure"),
    "метр": ("метр", "masc", "measure"),
    "см": ("сантиметр", "masc", "measure"),
    "cm": ("сантиметр", "masc", "measure"),
    "см²": ("квадратный сантиметр", "masc", "measure"),
    "см³": ("кубический сантиметр", "masc", "measure"),
    "см2": ("квадратный сантиметр", "masc", "measure"),
    "см3": ("кубический сантиметр", "masc", "measure"),
    "см^2": ("квадратный сантиметр", "masc", "measure"),
    "см^3": ("кубический сантиметр", "masc", "measure"),
    "мм": ("миллиметр", "masc", "measure"),
    "mm": ("миллиметр", "masc", "measure"),
    "мм²": ("квадратный миллиметр", "masc", "measure"),
    "мм³": ("кубический миллиметр", "masc", "measure"),
    "мм2": ("квадратный миллиметр", "masc", "measure"),
    "мм3": ("кубический миллиметр", "masc", "measure"),
    "мм^2": ("квадратный миллиметр", "masc", "measure"),
    "мм^3": ("кубический миллиметр", "masc", "measure"),
    "м²": ("квадратный метр", "masc", "measure"),
    "м³": ("кубический метр", "masc", "measure"),
    "м2": ("квадратный метр", "masc", "measure"),
    "м3": ("кубический метр", "masc", "measure"),
    "м^2": ("квадратный метр", "masc", "measure"),
    "м^3": ("кубический метр", "masc", "measure"),
    "кв.м": ("квадратный метр", "masc", "measure"),
    "квм": ("квадратный метр", "masc", "measure"),
    "куб.м": ("кубический метр", "masc", "measure"),
    "кубм": ("кубический метр", "masc", "measure"),
    "кмч": ("километр", "masc", "measure", "в час"),
    "км": ("километр", "masc", "measure"),
    "километр": ("километр", "masc", "measure"),
    "km": ("километр", "masc", "measure"),
    "км²": ("квадратный километр", "masc", "measure"),
    "км2": ("квадратный километр", "masc", "measure"),
    "км^2": ("квадратный километр", "masc", "measure"),
    "inch": ("дюйм", "masc", "measure"),
    "inches": ("дюйм", "masc", "measure"),
    "in³": ("кубический дюйм", "masc", "measure"),
    "л": ("литр", "masc", "measure"),
    "литр": ("литр", "masc", "measure"),
    "мл": ("миллилитр", "masc", "measure"),
    "ml": ("миллилитр", "masc", "measure"),
    "миллилитр": ("миллилитр", "masc", "measure"),
    "пинта": ("пинта", "femn", "measure"),
    "pint": ("пинта", "femn", "measure"),
    "м/с": ("метр", "masc", "measure", "в секунду"),
    "км/ч": ("километр", "masc", "measure", "в час"),
    "об/мин": ("оборот", "masc", "measure", "в минуту"),
    "rpm": ("оборот", "masc", "measure", "в минуту"),
    "ч": ("час", "masc", "measure"),
    "ч.": ("час", "masc", "measure"),
    "час": ("час", "masc", "measure"),
    "мин": ("минута", "femn", "measure"),
    "мин.": ("минута", "femn", "measure"),
    "минута": ("минута", "femn", "measure"),
    "сек": ("секунда", "femn", "measure"),
    "сек.": ("секунда", "femn", "measure"),
    "секунд": ("секунда", "femn", "measure"),
    "секунда": ("секунда", "femn", "measure"),
    "с": ("секунда", "femn", "measure"),
    "с.": ("секунда", "femn", "measure"),
    "мс": ("миллисекунда", "femn", "measure"),
    "мкс": ("микросекунда", "femn", "measure"),
    "нс": ("наносекунда", "femn", "measure"),
    "сут": ("сутки", "plur", "measure"),
    "сут.": ("сутки", "plur", "measure"),
    "дн": ("день", "masc", "measure"),
    "дн.": ("день", "masc", "measure"),
    "нед": ("неделя", "femn", "measure"),
    "нед.": ("неделя", "femn", "measure"),
    "мес": ("месяц", "masc", "measure"),
    "мес.": ("месяц", "masc", "measure"),
    "фут": ("фут", "masc", "measure"),
    "фута": ("фут", "masc", "measure"),
    "футов": ("фут", "masc", "measure"),
    "шт": ("штука", "femn", "measure"),
    "шт.": ("штука", "femn", "measure"),
    "штука": ("штука", "femn", "measure"),
    "экземпляр": ("экземпляр", "masc", "measure"),
    "человек": ("человек", "masc", "measure"),
    "единица": ("единица", "femn", "measure"),
    "чел": ("человек", "masc", "measure"),
    "чел.": ("человек", "masc", "measure"),
    "тыс": ("тысяча", "femn", "measure"),
    "тыс.": ("тысяча", "femn", "measure"),
    "тысяча": ("тысяча", "femn", "measure"),
    "тысячи": ("тысяча", "femn", "measure"),
    "тысяч": ("тысяча", "femn", "measure"),
    "млн": ("миллион", "masc", "measure"),
    "млн.": ("миллион", "masc", "measure"),
    "миллион": ("миллион", "masc", "measure"),
    "миллиона": ("миллион", "masc", "measure"),
    "миллионов": ("миллион", "masc", "measure"),
    "млрд": ("миллиард", "masc", "measure"),
    "млрд.": ("миллиард", "masc", "measure"),
    "миллиард": ("миллиард", "masc", "measure"),
    "миллиарда": ("миллиард", "masc", "measure"),
    "миллиардов": ("миллиард", "masc", "measure"),
    "трлн": ("триллион", "masc", "measure"),
    "трлн.": ("триллион", "masc", "measure"),
    "триллион": ("триллион", "masc", "measure"),
    "триллиона": ("триллион", "masc", "measure"),
    "триллионов": ("триллион", "masc", "measure"),
    "ар": ("ар", "masc", "measure"),
    "дм": ("дециметр", "masc", "measure"),
    "ft": ("фут", "masc", "measure"),
    "yd": ("ярд", "masc", "measure"),
    "mi": ("миля", "femn", "measure"),
    "аршин": ("аршин", "masc", "measure"),
    "арш": ("аршин", "masc", "measure"),
    "mph": ("миля", "femn", "measure", "в час"),
    "обмин": ("оборот", "masc", "measure", "в минуту"),
    "уз": ("узел", "masc", "measure"),
    "узел": ("узел", "masc", "measure"),
    "млн₽": ("миллион", "masc", "measure", "рублей"),
    "млрд₽": ("миллиард", "masc", "measure", "рублей"),
    "трлн₽": ("триллион", "masc", "measure", "рублей"),
    "тыс₽": ("тысяча", "femn", "measure", "рублей"),
    "млн$": ("миллион", "masc", "measure", "долларов"),
    "млрд$": ("миллиард", "masc", "measure", "долларов"),
    "тыс$": ("тысяча", "femn", "measure", "долларов"),
    "млн€": ("миллион", "masc", "measure", "евро"),
    "тыс€": ("тысяча", "femn", "measure", "евро"),
    "mah": ("миллиампер-час", "masc", "measure"),
    "мАч": ("миллиампер-час", "masc", "measure"),
    "ah": ("ампер-час", "masc", "measure"),
    "wh": ("ватт-час", "masc", "measure"),
    "kwh": ("киловатт-час", "masc", "measure"),
    "mwh": ("мегаватт-час", "masc", "measure"),
    "gwh": ("гигаватт-час", "masc", "measure"),
    "va": ("вольт-ампер", "masc", "measure"),
    "kva": ("киловольт-ампер", "masc", "measure"),
    "mol": ("моль", "femn", "measure"),
    "моль": ("моль", "femn", "measure"),
    "ммоль": ("миллимоль", "masc", "measure"),
    "mmol": ("миллимоль", "masc", "measure"),
    "мкмоль": ("микромоль", "masc", "measure"),
    "µmol": ("микромоль", "masc", "measure"),
    "μmol": ("микромоль", "masc", "measure"),
    "ммоль/л": ("миллимоль", "masc", "measure", "на литр"),
    "ммольл": ("миллимоль", "masc", "measure", "на литр"),
    "мг/л": ("миллиграмм", "masc", "measure", "на литр"),
    "мг/мл": ("миллиграмм", "masc", "measure", "на миллилитр"),
    "мкг/мл": ("микрограмм", "masc", "measure", "на миллилитр"),
    "мг/дл": ("миллиграмм", "masc", "measure", "на децилитр"),
    "ед": ("единица", "femn", "measure"),
    "ед.": ("единица", "femn", "measure"),
    "ме": ("международная единица", "femn", "measure"),
    "iu": ("международная единица", "femn", "measure"),
    "ui": ("международная единица", "femn", "measure"),
    "рад.": ("радиан", "masc", "measure"),
    "кадров/с": ("кадр", "masc", "measure", "в секунду"),
    "атм": ("атмосфер", "femn", "measure"),
}

ENTITY_KEYWORDS = {"percent": set(), "money": set(), "measure": set()}
for key, val in UNITS_DATA.items():
    lemma, _, category, *suffix = val
    ENTITY_KEYWORDS[category].add(key)
    ENTITY_KEYWORDS[category].add(lemma)

ENTITY_DEFAULT_CASE = {"percent": "nomn", "money": "nomn", "measure": "nomn"}
ALL_UNITS = set(UNITS_DATA.keys()) | {value[0] for value in UNITS_DATA.values()}

UNIT_TOKEN_FRAGMENT = (
    r"[а-яА-ЯёЁa-zA-ZµμΩ%°$€₽]+"
    r"(?:[./^][а-яА-ЯёЁa-zA-ZµμΩ%°$€₽]+|\d+|[²³])*"
)

NUMERIC_UNIT_RANGE_PATTERN = re.compile(
    rf"(?<!\d)(?P<left>\d+)\s*[—–-]\s*(?P<right>\d+)\s*(?P<unit>{UNIT_TOKEN_FRAGMENT}(?:\s+[^\W\d_]+){{0,2}})(?!\w)"
)
DECIMAL_PATTERN = re.compile(
    rf"(?<!\d)(?P<num>(?:-|\\ue001)?\d+[.,]\d+)(?:\s*(?P<unit>{UNIT_TOKEN_FRAGMENT})(?P<unit_dot>\.)?)?(?:\s+(?P<unit2>{UNIT_TOKEN_FRAGMENT})(?P<unit2_dot>\.)?)?(?!\d)"
)
FRACTION_PATTERN = re.compile(r"(?<![\d,])(\d+)/(\d+)(?![\d,])")
HYPHENATED_WORD_PATTERN = re.compile(r"(?<![\d])(\d+)-([а-яА-ЯёЁ]{1,})")
ORDINAL_PATTERN = re.compile(r"(\d+)-([а-яА-ЯёЁ]{1,3})\b", re.IGNORECASE | re.UNICODE)
STANDALONE_CURRENCY_PATTERN = re.compile(r"(?<!\S)([$€£¥₽₴₸₺₹¢])(?!\S)")
DIGIT_PATTERN = re.compile(r"\d+")

TIME_WORDS = {
    "год": "masc",
    "года": "masc",
    "лет": "masc",
    "году": "masc",
    "годом": "masc",
    "годе": "masc",
    "годов": "masc",
    "годам": "masc",
    "годами": "masc",
    "годах": "masc",
    "месяц": "masc",
    "месяца": "masc",
    "месяцев": "masc",
    "месяцу": "masc",
    "месяцем": "masc",
    "месяце": "masc",
    "месяцам": "masc",
    "месяцами": "masc",
    "месяцах": "masc",
    "день": "masc",
    "дня": "masc",
    "дней": "masc",
    "дню": "masc",
    "днем": "masc",
    "днём": "masc",
    "дне": "masc",
    "дням": "masc",
    "днями": "masc",
    "днях": "masc",
    "неделя": "femn",
    "недели": "femn",
    "недель": "femn",
    "неделе": "femn",
    "неделю": "femn",
    "неделей": "femn",
    "неделях": "femn",
    "неделям": "femn",
    "неделями": "femn",
    "сутки": "plur",
    "сут": "plur",
    "суток": "plur",
    "суткам": "plur",
    "сутками": "plur",
    "сутках": "plur",
    "час": "masc",
    "часа": "masc",
    "часов": "masc",
    "часу": "masc",
    "часом": "masc",
    "часе": "masc",
    "часам": "masc",
    "часами": "masc",
    "часах": "masc",
    "минута": "femn",
    "минуты": "femn",
    "минут": "femn",
    "минуте": "femn",
    "минуту": "femn",
    "минутой": "femn",
    "минутам": "femn",
    "минутами": "femn",
    "минутах": "femn",
    "секунда": "femn",
    "сек": "femn",
    "секунд": "femn",
    "секунды": "femn",
    "секунде": "femn",
    "секунду": "femn",
    "секундой": "femn",
    "секундам": "femn",
    "секундами": "femn",
    "секундах": "femn",
    "ч": "masc",
    "мин": "femn",
    "с": "femn",
    "дн": "masc",
    "нед": "femn",
    "в": "masc",
    "в.": "masc",
    "век": "masc",
    "века": "masc",
    "веку": "masc",
    "веке": "masc",
    "веком": "masc",
    "веков": "masc",
    "столетие": "neut",
    "столетия": "neut",
    "столетию": "neut",
    "столетии": "neut",
    "столетием": "neut",
}
