def generate_komektes_septik(word_and_tags: tuple) -> list:
    """Функция, генерирующая көмектес септік (instrumental case).
    Гласные и м, н, ң, р, л
        -мен
    ж, з
        -бен
    Глухие и б, в, г, д
        -пен
    """
    word, tags = word_and_tags
    result = []
    new_word = ""

    if (word[-1] in vowels) \
            or (word[-1] in ['м', 'н', 'ң', 'р', 'л']):
        new_word = add_affix_with_harmony(word, affix="мен")
    elif (word[-1] in ['ж', 'з']):
        new_word = add_affix_with_harmony(word, affix="бен")
    elif (word[-1] in voiceless_consonant) \
            or (word[-1] in ['б', 'в', 'г', 'д']):
        new_word = add_affix_with_harmony(word, affix="пен")

    new_tags = tags.copy()
    new_tags["case"] = "<ins>"
    result.append((new_word, new_tags))

    return result
def generate_reflexive_verb(word_and_tags: tuple) -> list:
    """функция, генерирующая возвратный залог глагола.
    Основа + -н/-ын/-ін
    """
    word, tags = word_and_tags
    result = []

    if word[-1] in vowels:
        new_word = add_affix_with_harmony(word, affix='н')
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix='ын',
                                                   soft_affix='ін')
    new_tags = tags.copy()
    new_tags["reflexivity"] = "<ref>"
    result.append((new_word, new_tags))

    return result
def generate_all_buryngy_otken_shaq_3(word_and_tags: tuple) -> list:
    """функция, генерирующая бұрынғы өткен шақ 3 во всех лицах
    Основа глагола + -п/-ып/-іп + личные окончания
    гласные -п
    согласные -ып/-іп
    """
    word, tags = word_and_tags
    result = []

    if word[-1] in vowels:
        new_word = add_affix_with_harmony(word, affix='п')
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ып",
                                                   soft_affix="іп")
    new_tags = tags.copy()
    new_tags["tense"] = "<past><buryngy-otken-3>"

    # Добавляем все личные окончания
    result += generate_all_long_personals_with_3p((new_word, new_tags))

    return result
def generate_all_bolzhaldy_keler_shaq(word_and_tags: tuple) -> list:
    """функция, генерирующая болжалды келер шақ во всех лицах.
    Основа глагола + -ар/-ер/-р + личные окончания (длинные без 3 лица)
    ар – в твёрдых словах
    ер – в мягких словах
    р – после гласных
    """
    word, tags = word_and_tags
    result = []

    if word[-1] in vowels:
        new_word = add_affix_with_harmony(word, affix='р')
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix='ар',
                                                   soft_affix='ер')
    new_tags = tags.copy()
    new_tags["tense"] = "<future><bolzhaldy-keler>"

    # Добавляем все личные окончания
    result += generate_all_long_personals_without_3p((new_word, new_tags))

    return result
def generate_all_auyspaly_osy_keler_shaq(word_and_tags: tuple) -> list:
    """функция, генерирующая ауыспалы осы/келер шақ во всех лицах.
    Основа глагола + -а/-е/-й + личные окончания (длинные с 3 лицом)
    а – в твёрдых словах
    е – в мягких словах
    й – после гласных
    """
    word, tags = word_and_tags
    result = []

    if word[-1] in vowels:
        new_word = add_affix_with_harmony(word, affix='й')
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix='а',
                                                   soft_affix='е')
    new_tags = tags.copy()
    new_tags["tense"] = "<pres><future>"

    # Добавляем все личные окончания
    result += generate_all_long_personals_with_3p((new_word, new_tags))

    return result
def generate_tabys_septik(word_and_tags: tuple) -> list:
    """Функция, генерирующая табыс септік (accusative case).
    После аффиксов 3-го лица
        -н
    Гласные
        -ны, -нi
    Сонорные и з, ж
        -ды, -дi
    Глухие и б, в, г, д
        -ты, -тi
    """
    word, tags = word_and_tags
    result = []
    new_word = ""

    if "<px3sp>" in tags.values():
        new_word = add_affix_with_harmony(word, affix='н')
    elif (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ны",
                                                   soft_affix="нi")
    elif (word[-1] in sonorous_consonants) \
            or (word[-1] in ['з', 'ж']):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ды",
                                                   soft_affix="дi")
    elif (word[-1] in voiceless_consonant) \
            or (word[-1] in ['б', 'в', 'г', 'д']):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ты",
                                                   soft_affix="тi")
    new_tags = tags.copy()
    new_tags["case"] = "<acc>"
    result.append((new_word, new_tags))

    return result
def generate_all_short_personals(word_and_tags: tuple) -> list:
    # region
    """Функция, генерирующая личную форму (жіктік).
    Краткие  личные окончания. Окончаний нет в третьем лице.
    (Применяются в очевидно-прошедшими времени и условном наклонении глагола)

    1 лицо ед.числа
        -м
        -ым, -ім

    2 лицо ед.числа
        -ң
        -ың, -ің

    2 лицо ед.числа (вежливое)
        -ңыз/-ңіз
        -ыңыз/-іңіз

    1 лицо мн.числа
        -қ
        -ық, -ік

    2 лицо мн.числа
        -ңдар/-ңдер
        -ыңдар/іңдер

    2 лицо мн.числа (вежливое)
        -ңыздар/-ңіздер
        -ыңыздар/-іңіздер

    3 лицо ед. и мн. числа
        -
    """
    # endregion

    word, tags = word_and_tags
    result = []

    # ед.число
    if ("plurality" not in tags) or (tags["plurality"] != "<pl>"):
        # 1 лицо ед.числа
        # -м
        # -ым, -ім
        if (word[-1] in vowels):
            new_word = add_affix_with_harmony(word, affix='м')
        else:
            new_word = add_affix_choosing_hard_or_soft(word,
                                                       hard_affix="ым",
                                                       soft_affix="ім")
        new_tags = tags.copy()
        new_tags["person"] = "<p1>"
        new_tags["plurality"] = "<sg>"
        result.append((new_word, new_tags))

        # 2 лицо ед.числа
        # -ң
        # -ың, -ің
        if (word[-1] in vowels):
            new_word = add_affix_with_harmony(word, affix='ң')
        else:
            new_word = add_affix_choosing_hard_or_soft(word,
                                                       hard_affix="ың",
                                                       soft_affix="ің")
        new_tags = tags.copy()
        new_tags["person"] = "<p2>"
        new_tags["plurality"] = "<sg>"
        result.append((new_word, new_tags))

        # 2 лицо ед.числа (вежливое)
        # -ңыз/-ңіз
        # -ыңыз/-іңіз
        if (word[-1] in vowels):
            new_word = add_affix_choosing_hard_or_soft(word,
                                                       hard_affix="ңыз",
                                                       soft_affix="ңіз")
        else:
            new_word = add_affix_choosing_hard_or_soft(word,
                                                       hard_affix="ыңыз",
                                                       soft_affix="іңіз")
        new_tags = tags.copy()
        new_tags["person"] = "<p2_2>"
        new_tags["plurality"] = "<sg>"
        result.append((new_word, new_tags))

    # мн.число

    # 1 лицо мн.числа
    # -қ
    # -ық, -ік
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="қ",
                                                   soft_affix="к")
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ық",
                                                   soft_affix="ік")
    new_tags = tags.copy()
    new_tags["person"] = "<p1>"
    new_tags["plurality"] = "<pl>"
    result.append((new_word, new_tags))

    # 2 лицо мн.числа
    # -ңдар/-ңдер
    # -ыңдар/іңдер
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ңдар",
                                                   soft_affix="ңдер")
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ыңдар",
                                                   soft_affix="іңдер")
    new_tags = tags.copy()
    new_tags["person"] = "<p2>"
    new_tags["plurality"] = "<pl>"
    result.append((new_word, new_tags))

    # 2 лицо мн.числа (вежливое)
    # -ңыздар/-ңіздер
    # -ыңыздар/-іңіздер
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ңыздар",
                                                   soft_affix="ңіздер")
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ыңыздар",
                                                   soft_affix="іңіздер")
    new_tags = tags.copy()
    new_tags["person"] = "<p2_2>"
    new_tags["plurality"] = "<pl>"
    result.append((new_word, new_tags))

    # 3 лицо ед. и мн. числа
    #     -
    new_word = word
    new_tags = tags.copy()
    new_tags["person"] = "<p3>"
    new_tags["plurality"] = "<sp>"
    result.append((new_word, new_tags))

    return result
def generate_all_possessives(word_and_tags: tuple) -> list:
    # region
    """Функция, генерирующая притяжательную форму (тәуiлдiк).
    1 лицо ед.числа
    После гласных
        -м
    После согласных
        -ым, -iм

    1 лицо мн.числа
    После гласных
        -мыз, -мiз
    После согласных
        -ымыз, -iмiз

    2 лицо ед. и мн.числа
    После гласных
        -ң
    После согласных
        -ың, -iң

    2 лицо ед. и мн.числа (вежливое)
    После гласных
        -ңыз, -ңыз
    После согласных
        -ыңыз, -iңiз

    3 лицо ед. и мн. числа
    После гласных
        -сы, -сi
    После согласных
        -ы, -i
    """
    # endregion

    word, tags = word_and_tags
    result = []

    # 1 лицо ед.числа
    # После гласных
    #     -м
    # После согласных
    #     -ым, -iм

    if (word[-1] in vowels):
        new_word = add_affix_with_harmony(word, affix='м')
    # elif (word[-1] in consonants):
    else:
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ым",
                                                   soft_affix="ім")
    new_tags = tags.copy()
    new_tags["person"] = "<p1>"
    new_tags["possession"] = "<px1sg>"
    result.append((new_word, new_tags))

    # 1 лицо мн.числа
    # После гласных
    #     -мыз, -мiз
    # После согласных
    #     -ымыз, -iмiз
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="мыз",
                                                   soft_affix="мiз")
    elif (word[-1] in consonants):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ымыз",
                                                   soft_affix="iмiз")
    new_tags = tags.copy()
    new_tags["person"] = "<p1>"
    new_tags["possession"] = "<px1pl>"
    result.append((new_word, new_tags))

    # 2 лицо ед. и мн.числа
    # После гласных
    #     -ң
    # После согласных
    #     -ың, -iң
    if (word[-1] in vowels):
        new_word = add_affix_with_harmony(word, affix='ң')
    elif (word[-1] in consonants):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ың",
                                                   soft_affix="iң")
    # тут подходят px2sg и px2pl, пока ставится "объединенный вариант"
    new_tags = tags.copy()
    new_tags["person"] = "<p2>"
    new_tags["possession"] = "<px2sp>"
    result.append((new_word, new_tags))

    # 2 лицо ед. и мн.числа (вежливое)
    # После гласных
    #     -ңыз, -ңiз
    # После согласных
    #     -ыңыз, -iңiз
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ңыз",
                                                   soft_affix="ңiз")
    elif (word[-1] in consonants):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ыңыз",
                                                   soft_affix="iңiз")
    # тут подходят px2sg и px2pl, пока ставится "объединенный вариант"
    # TODO придумать тег для вежлифой формы
    new_tags = tags.copy()
    new_tags["person"] = "<p2_2>"
    new_tags["possession"] = "<px2sp_2>"
    result.append((new_word, new_tags))

    # 3 лицо ед. и мн. числа
    # После гласных
    #     -сы, -сi
    # После согласных
    #     -ы, -i
    if (word[-1] in vowels):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="сы",
                                                   soft_affix="сi")
    elif (word[-1] in consonants):
        new_word = add_affix_choosing_hard_or_soft(word,
                                                   hard_affix="ы",
                                                   soft_affix="i")
    new_tags = tags.copy()
    new_tags["person"] = "<p3>"
    new_tags["possession"] = "<px3sp>"
    result.append((new_word, new_tags))

    return result