from text_to_num import text2num
from collections import Counter

# Перевести на французский!!!
# ---------------------
g_lang = "en"
# ---------------------


# Не смотри на эту функцию - она большой костыль, потому что мне было лень думать
# А вообще эта функция фильтрует слова, которые не подхоят text_to_num
# Благодаря этой функции эта прога подходит ко всем языкам.
def func_find_word_num(list_words):
    list_words_checker = []

    for word in list_words:
        # Костыль для английского языка. Почему - то эта библиотека не понимает слово million итд, но вот слово
        # thousand, например, она может понять. Странно :ъ
        if 'illion' in word and g_lang == "en":
            list_words_checker.append(word)
            continue

        try:
            text2num(word, lang=g_lang)
        except:
            continue
        else:
            list_words_checker.append(word)

    return list_words_checker


# Эта функция переводит арабские цифры в римские.
def func_check_io(n):
    result = ''

    for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
                             'M     CM   D    CD   C    XC  L   XL  X   IX V  IV I'.split()):
        result += n // arabic * roman
        n %= arabic

    return result


# Эта функция просто считает сколько раз то или иное слово встретилось в списке
def func_count_numbers_in_list(list_words):
    return dict(Counter(list_words))


# Эта функция просто считает сколько раз повторилось слово, которое не должно было повторяться.
def func_count_repeat_numbers_in_list(list_words):
    list_words_repeat = []

    for index in range(1, len(list_words)):
        if list_words[index - 1] == list_words[index]:
            list_words_repeat.append(list_words[index])
        else:
            continue

    return dict(Counter(list_words_repeat))


# Эта функция генерирует список слов, которые являются цифрой так или иначе.
def func_split_str_numbers(line):
    list_words = line.split()
    list_word_result = []

    for word in list_words:
        for word_check in set(func_find_word_num(list_words)):
            if word == word_check:
                list_word_result.append(word)
            else:
                continue

    return list_word_result


# Главная функция
def main():
    while True:
        number = input('\nВведите число: ').lower()

        if number == 'stop':
            break

        try:
            print('Arabic =', text2num(number, lang=g_lang))
            print('Roman =', func_check_io(text2num(number, lang=g_lang)))
        except Exception as e:
            length = len(str(repr(e)))

            print('-' * length, '\nОшибка!\n')

            dict_repeat_num = func_count_repeat_numbers_in_list(func_split_str_numbers(number))
            dict_num = func_count_numbers_in_list(func_split_str_numbers(number))

            set_incorrect_words = set(number.split())
            set_repeat_num = set(dict_num.keys())
            set_incorrect_words -= set_repeat_num

            for key in dict_repeat_num:
                print('* {} повторяется {} лишний(их) раз'.format(key, dict_repeat_num[key]))

            if set_incorrect_words != set():
                print('Некорректные слова:', set_incorrect_words)

            print('\nПодробнее:\n', repr(e), '\n', '-' * length)


# Точка входа в программу
if __name__ == '__main__':
    main()
