# -*- coding: utf-8 -*-
from enum import Enum

PART_OF_SPEECH = {
    'СУ': 'Существительное',
    'ПП': 'Полное прилагательное',
    'КП': 'Краткое прилагательное',
    'ДЕ': 'Деепричастие',
    'ГЛ': 'Глагол',
    'НА': 'Наречие',
    'ЧИ': 'Числительное',
    'МЕ': 'Местоимение',
    'СО': 'Союз',
    'ПР': 'Предлог',
    'ДР': 'Неопределённая часть речи'}

# Род
GENDER = {
    'МР': 'Мужской род',
    'ЖР': 'Женский род',
    'СР': 'Средний род',
    'НР': 'Неопределённый род'}

# Падеж
CASE = {
    'ИП': 'Именительный падеж',
    'РП': 'Родительный падеж',
    'ДП': 'Дательный падеж',
    'ВП': 'Винительный падеж',
    'ТП': 'Творительный падеж',
    'ПП': 'Предложный падеж'}

CASES = ['ИП', 'РП', 'ДП', 'ВП', 'ТП', 'ПП']

# Число
NUMBER = {
    'ЕЧ': 'Единственное число',
    'МЧ': 'Множественное число',
    'НЧ': 'Неопределённое число'}

# Время
TENSE = {
    'НВ': 'Настоящее время',
    'ПВ': 'Прошедшее время',
    'ИН': 'Инфинитив'}

# Вид
ASPECT = {
    'СВ': 'Совершенный вид',
    'НВ': 'Несовершенный вид'}

# Лицо
PERSON = {
    '1Л': 'Первое лицо',
    '2Л': 'Второе лицо',
    '3Л': 'Третье лицо',
    'НЛ': 'Неопределённое лицо'}

# Морфологическая информация
MORPHOLOGY_ITEM_DICT = {
    'part_of_speech': PART_OF_SPEECH,
    'gender': GENDER,
    'case': CASE,
    'number': NUMBER,
    'tense': TENSE,
    'aspect': ASPECT,
    'person': PERSON
}

# Тип словаря
DICTIONARY_TYPE = {
    'NoninflectedWords': 'Словарь готовых словоформ',
    'Predicates': 'Словарь предикатов',
    'Entities': 'Словарь понятий',
    'Characters': 'Словарь характеристик',
    'Flexies': 'Словарь квазифлексий',
    'Synonyms': 'Словарь синонимов',
    'Parameters': 'Словарь параметров',
    'GluedWords': 'Словарь сложных лексем',
    'Unknown': 'Неизвестный словарь'
}

# Тип актанта
ACTANT_TYPE = {
    'A': 'agent',  # агент
    'O': 'object',  # объект
    'D': 'destination',  # адресат
    'T': 'topic',  # тема
    'I': 'instrument',  # инструмент
    'L': 'location',  # место
    'S': 'startsFrom',  # Начальная точка (уточняет L)
    'F': 'finishesAt',  # Конечной точка (уточняет L)
    'G': 'goal',  # цель
    'C': 'clause',  # условие
    'W': 'dueTime',  # время. возможно уточнить до начала и конца действия
    'M': 'method',  # способ
    'P': 'period',  # интервал времени, срок, связано с W
    'Q': 'quantity',  # количество
    'R': 'result',  # Результат
    'U': 'undefined'  # Неопределенный актант
}

# Типы НЕ-факторов
NON_FACTORS_TYPES = {
    'НЧ': 'Нечеткость',
    'НО': 'Неопределенность',
    'НТ': 'Неточность',
    'НД': 'Недоопределенность'
}

# Таблица соответствия типов словоизменения в словаре Зализняка
NOUN_INFLECTION_TYPES = {
    '01': '1a'
}


# Часть речи opencorpora
class PartOfSpeech(Enum):
    NOUN = 1  # существительное
    ADJECTIVE = 2  # прилагательное
    PRONOUN = 3  # местоимение
    NUMERAL = 4  # числительное
    VERB = 5  # глагол
    ADVERB = 6  # наречие
    PARTICIPLE = 7  # причастие
    GERUND = 8  # деепричастие (герундий не очень точный термин)

    STATIVE = 9  # категории состояния (сказуемые безличных предложений)

    CONJUNCTION = 10  # союз (и)
    PREPOSITION = 11  # предлог (в)
    PARTICLE = 12  # частица (просто)
    INTERJECTION = 13  # междометие (ну)
    MODAL = 14  # модальное слово (возможно)
    EXCLAMATION = 15  # восклицание (ой)


# Часть речи opencorpora
class SubPartOfSpeech(Enum):
    NOUN_COUNTABLE = 101  # исчисляемые существительные (цветок)
    NOUN_UNCOUNTABLE = 102  # неисчисляемые существительные (вода)

    ADJECTIVE_QUALITATIVE = 201  # качественные прилагательные
    ADJECTIVE_RELATIVE = 202  # относительные прилагательные

    PRONOUN_PERSONAL = 301  # личные местоимения (он)
    PRONOUN_POSSESSIVE = 302  # притяжательные местоимения (мой)
    PRONOUN_DEMONSTRATIVE = 303  # указательные местоимения (этот)
    PRONOUN_INDEFINITE = 304  # неопределённые местоимения (что-то)
    PRONOUN_REFLEXIVE = 305  # возвратные местоимения (каждый)
    PRONOUN_NEGATIVE = 306  # отрицательные местоимения (никто)

    NUMERAL_ORDINAL = 401  # порядковые числительные (первый)
    NUMERAL_CARDINAL = 402  # количественные числительные (один)

    VERB_NOTIONAL = 501  # смысловые глаголы
    VERB_SEMI_AUXILLIARY = 502  # служебные глаголы
    VERB_AUXILLIARY = 503  # вспомогательные глаголы


# Типы задач
class TaskTypes(Enum):
    UNKNOWN_TASK_TYPE = 0
    WORK_TASK_TYPE = 1
    MOTION_TASK_TYPE = 2
    GEOMETRY_TASK_TYPE = 3


## Словарь склонения единиц измерения для OpenCorporaTag
# для числительных в именительном падеже

INFLECTION_DICT = {
    'masc':  # час
        {
            1: ('sing', 'nomn'),  # один час
            2: ('sing', 'gent'),  # два часа (о, да, единственное число в родительном. реликтовая форма двойственного числа.)
            3: ('sing', 'gent'),  # три часа
            4: ('sing', 'gent'),  # четыре часа
            5: ('plur', 'gent'),  # пять часов (а тут уже множественное)
            6: ('plur', 'gent'),  # шесть часов
            7: ('plur', 'gent'),  # семь часов
            8: ('plur', 'gent'),  # восемь часов
            9: ('plur', 'gent'),  # девять часов
            0: ('plur', 'gent')  # ноль часов, десять часов
        },
    'femn':  # минута
        {
            1: ('sing', 'nomn'),  # одна минута
            2: ('plur', 'nomn'),  # две минуты (множественное в именительном)
            3: ('plur', 'nomn'),  # три минуты
            4: ('plur', 'nomn'),  # четыре минуты
            5: ('plur', 'gent'),  # пять минут (а тут пошёл родительный)
            6: ('plur', 'gent'),  # шесть минут
            7: ('plur', 'gent'),  # семь минут
            8: ('plur', 'gent'),  # восемь минут
            9: ('plur', 'gent'),  # девять минут
            0: ('plur', 'gent')  # ноль минут, десять минут
        },
    'neut':  # полугодие
        {
            1: ('sing', 'nomn'),  # одно полугодие
            2: ('plur', 'nomn'),  # два полугодия (множественное в именительном или единственное в родительном)
            3: ('plur', 'nomn'),  # три полугодия
            4: ('plur', 'nomn'),  # четыре полугодия
            5: ('plur', 'gent'),  # пять полугодий (а тут пошли множественные в родительном)
            6: ('plur', 'gent'),  # шесть полугодий
            7: ('plur', 'gent'),  # семь полугодий
            8: ('plur', 'gent'),  # восемь полугодий
            9: ('plur', 'gent'),  # девять полугодий
            0: ('plur', 'gent')  # ноль полугодий, десять полугодий
        }
}

# TODO для числительных в других падежах
INFLECTION_DICT_ = {
    'nomn':  # за один час, на пять минут, три полугодия. accs = nomn
        {
            'masc':  # час
                {
                    1: ('sing', 'nomn'),  # один час
                    2: ('sing', 'gent'),  # два часа (о, да, единственное число в родительном)
                    3: ('sing', 'gent'),  # три часа
                    4: ('sing', 'gent'),  # четыре часа
                    5: ('plur', 'gent'),  # пять часов (а тут уже множественное)
                    6: ('plur', 'gent'),  # шесть часов
                    7: ('plur', 'gent'),  # семь часов
                    8: ('plur', 'gent'),  # восемь часов
                    9: ('plur', 'gent'),  # девять часов
                    0: ('plur', 'gent')  # ноль часов, десять часов
                },
            'femn':  # минута
                {
                    1: ('sing', 'nomn'),  # одна минута
                    2: ('plur', 'nomn'),  # две минуты (множественное в именительном)
                    3: ('plur', 'nomn'),  # три минуты
                    4: ('plur', 'nomn'),  # четыре минуты
                    5: ('plur', 'gent'),  # пять минут (а тут пошёл родительный)
                    6: ('plur', 'gent'),  # шесть минут
                    7: ('plur', 'gent'),  # семь минут
                    8: ('plur', 'gent'),  # восемь минут
                    9: ('plur', 'gent'),  # девять минут
                    0: ('plur', 'gent')  # ноль минут, десять минут
                },
            'neut':  # полугодие
                {
                    1: ('sing', 'nomn'),  # одно полугодие
                    2: ('plur', 'nomn'),  # два полугодия (множественное в именительном или единственное в родительном)
                    3: ('plur', 'nomn'),  # три полугодия
                    4: ('plur', 'nomn'),  # четыре полугодия
                    5: ('plur', 'gent'),  # пять полугодий (а тут пошли множественные в родительном)
                    6: ('plur', 'gent'),  # шесть полугодий
                    7: ('plur', 'gent'),  # семь полугодий
                    8: ('plur', 'gent'),  # восемь полугодий
                    9: ('plur', 'gent'),  # девять полугодий
                    0: ('plur', 'gent')  # ноль полугодий, десять полугодий
                }
        },
    'gent':  # одного часа, четырёх минут, трёх полугодий
        {
            'masc':  # час
                {
                    1: ('sing', 'gent'),  # одного часа
                    2: ('plur', 'gent'),  # двух часов
                    3: ('plur', 'gent'),  # трёх часов
                    4: ('plur', 'gent'),  # четырёх часов
                    5: ('plur', 'gent'),  # пяти часов
                    6: ('plur', 'gent'),  # шести часов
                    7: ('plur', 'gent'),  # семи часов
                    8: ('plur', 'gent'),  # восьми часов
                    9: ('plur', 'gent'),  # девяти часов
                    0: ('plur', 'gent')  # ноля часов, десяти часов
                },
            'femn':  # минута
                {
                    1: ('sing', 'gent'),  # одной минуты
                    2: ('plur', 'gent'),  # двух минут
                    3: ('plur', 'gent'),  # трёх минут
                    4: ('plur', 'gent'),  # четырёх минут
                    5: ('plur', 'gent'),  # пяти минут
                    6: ('plur', 'gent'),  # шести минут
                    7: ('plur', 'gent'),  # семи минут
                    8: ('plur', 'gent'),  # восьми минут
                    9: ('plur', 'gent'),  # девяти минут
                    0: ('plur', 'gent')  # ноля минут, десяти минут
                },
            'neut':  # полугодие
                {
                    1: ('sing', 'gent'),  # одного полугодия
                    2: ('plur', 'gent'),  # двух полугодий
                    3: ('plur', 'gent'),  # трёх полугодий
                    4: ('plur', 'gent'),  # четырёх полугодий
                    5: ('plur', 'gent'),  # пяти полугодий
                    6: ('plur', 'gent'),  # шести полугодий
                    7: ('plur', 'gent'),  # семи полугодий
                    8: ('plur', 'gent'),  # восьми полугодий
                    9: ('plur', 'gent'),  # девяти полугодий
                    0: ('plur', 'gent')  # нуля полугодий, десяти полугодий
                }
        },
    'datv':  # одному часу, четырём минутам, трём полугодиям
        {
            'masc':  # час
                {
                    1: ('sing', 'datv'),  # одному часу
                    2: ('plur', 'datv'),  # двум часам
                    3: ('plur', 'datv'),  # трём часам
                    4: ('plur', 'datv'),  # четырём часам
                    5: ('plur', 'datv'),  # пяти часам
                    6: ('plur', 'datv'),  # шести часам
                    7: ('plur', 'datv'),  # семи часам
                    8: ('plur', 'datv'),  # восьми часам
                    9: ('plur', 'datv'),  # девяти часам
                    0: ('plur', 'datv')  # нулю часам, десяти часам
                },
            'femn':  # минута
                {
                    1: ('sing', 'datv'),  # одной минуте
                    2: ('plur', 'datv'),  # двум минутам
                    3: ('plur', 'datv'),  # трём минутам
                    4: ('plur', 'datv'),  # четырём минутам
                    5: ('plur', 'datv'),  # пяти минутам
                    6: ('plur', 'datv'),  # шести минутам
                    7: ('plur', 'datv'),  # семи минутам
                    8: ('plur', 'datv'),  # восьми минутам
                    9: ('plur', 'datv'),  # девяти минутам
                    0: ('plur', 'datv')  # нулю минутам, десяти минутам
                },
            'neut':  # полугодие
                {
                    1: ('sing', 'datv'),  # одному полугодию
                    2: ('plur', 'datv'),  # двум полугодиям
                    3: ('plur', 'datv'),  # трём полугодиям
                    4: ('plur', 'datv'),  # четырём полугодиям
                    5: ('plur', 'datv'),  # пяти полугодиям
                    6: ('plur', 'datv'),  # шести полугодиям
                    7: ('plur', 'datv'),  # семи полугодиям
                    8: ('plur', 'datv'),  # восьми полугодиям
                    9: ('plur', 'datv'),  # девяти полугодиям
                    0: ('plur', 'datv')  # нулю полугодиям, десяти полугодиям
                }
        },
    'ablt':  # одним часом, четырьмя минутами, тремя полугодиями
        {
            'masc':  # час
                {
                    1: ('sing', 'ablt'),  # одним часом
                    2: ('plur', 'ablt'),  # двумя часами
                    3: ('plur', 'ablt'),  # тремя часами
                    4: ('plur', 'ablt'),  # четырьмя часаами
                    5: ('plur', 'ablt'),  # пятью часами
                    6: ('plur', 'ablt'),  # шестью часами
                    7: ('plur', 'ablt'),  # семью часами
                    8: ('plur', 'ablt'),  # восемью часами
                    9: ('plur', 'ablt'),  # девятью часами
                    0: ('plur', 'ablt')  # нулём часов! gent, десятью часами
                },
            'femn':  # минута
                {
                    1: ('sing', 'ablt'),  # одной минутой
                    2: ('plur', 'ablt'),  # двумя минутами
                    3: ('plur', 'ablt'),  # тремя минутами
                    4: ('plur', 'ablt'),  # четырьмя минутами
                    5: ('plur', 'ablt'),  # пятью минутами
                    6: ('plur', 'ablt'),  # шестью минутами
                    7: ('plur', 'ablt'),  # семью минутами
                    8: ('plur', 'ablt'),  # восемью минутами
                    9: ('plur', 'ablt'),  # девятью минутами
                    0: ('plur', 'ablt')  # нулём минут! gent, десятью минутами
                },
            'neut':  # полугодие
                {
                    1: ('sing', 'ablt'),  # одним полугодием
                    2: ('plur', 'ablt'),  # двумя полугодиями
                    3: ('plur', 'ablt'),  # тремя полугодиями
                    4: ('plur', 'ablt'),  # четырьмя полугодиями
                    5: ('plur', 'ablt'),  # пятью полугодиями
                    6: ('plur', 'ablt'),  # шестью полугодиями
                    7: ('plur', 'ablt'),  # семью полугодиями
                    8: ('plur', 'ablt'),  # восемью полугодиями
                    9: ('plur', 'ablt'),  # девятью полугодиями
                    0: ('plur', 'ablt')  # нулём полугодий! gent, десятью полугодиями
                }
        },
        'loct':  # об одном часе, о четырёх минутах, о трёх полугодиях
        {
            'masc':  # час
                {
                    1: ('sing', 'loct'),  # одном часе
                    2: ('plur', 'loct'),  # двух часах
                    3: ('plur', 'loct'),  # трёх часах
                    4: ('plur', 'loct'),  # четырёх часах
                    5: ('plur', 'loct'),  # пяти часах
                    6: ('plur', 'loct'),  # шести часах
                    7: ('plur', 'loct'),  # семи часах
                    8: ('plur', 'loct'),  # восьми часах
                    9: ('plur', 'loct'),  # девяти часах
                    0: ('plur', 'loct')  # нуле часов! gent, десяти часах
                },
            'femn':  # минута
                {
                    1: ('sing', 'loct'),  # одной минуте
                    2: ('plur', 'loct'),  # двух минутах
                    3: ('plur', 'loct'),  # трёх минутах
                    4: ('plur', 'loct'),  # четырёх минутах
                    5: ('plur', 'loct'),  # пяти минутах
                    6: ('plur', 'loct'),  # шести минутах
                    7: ('plur', 'loct'),  # семи минутах
                    8: ('plur', 'loct'),  # восьми минутах
                    9: ('plur', 'loct'),  # девяти минутах
                    0: ('plur', 'loct')  # в нуле минут! gent, десяти минутах
                },
            'neut':  # полугодие
                {
                    1: ('sing', 'loct'),  # одном полугодии
                    2: ('plur', 'loct'),  # двух полугодиях
                    3: ('plur', 'loct'),  # трёх полугодиях
                    4: ('plur', 'loct'),  # четырёх полугодиях
                    5: ('plur', 'loct'),  # пяти полугодиях
                    6: ('plur', 'loct'),  # шести полугодиях
                    7: ('plur', 'loct'),  # семи полугодиях
                    8: ('plur', 'loct'),  # восьми полугодиях
                    9: ('plur', 'loct'),  # девяти полугодиях
                    0: ('plur', 'loct')  # нуле полугодий! gent, десяти полугодиях
                }
        }
}
