"""
  Автор: Мигурский Александр, группа P3355
  Решение реализовано внутри класса DateToTextClass и содержится внутри метода convert
"""

from datetime import datetime



class DateToTextClass():
    """
    Преобразует дату и время в формате [число.месяц.год час:мин:сек] в текстовое представление на русском языке
    """

    def __init__(self,dateTime):
        self.dateTime = datetime.strptime(dateTime, '%d.%m.%Y %H:%M:%S')
        
    def year_text(self):
        year_full_ths_text = {
            1: "тысячного",
            2: "двухтысячного",
            3: "трехтысячного",
            4: "четырехтысячного",
            5: "пятитысячного",
            6: "шеститысячного",
            7: "семитысячного",
            8: "восьмитысячного",
            9: "девятитысячного",
        }
        
        year_ths_text = {
            0: "",
            1: "одна тысяча ",
            2: "две тысячи ",
            3: "три тысячи ",
            4: "четыре тысячи ",
            5: "пять тысяч ",
            6: "шесть тысяч ",
            7: "семь тысяч ",
            8: "восемь тысяч ",
            9: "девять тысяч ",
        }
        
        year_full_hunds_text = {
            1: "сотого",
            2: "двухсотого",
            3: "трехсотого",
            4: "четырехсотого",
            5: "пятисотого",
            6: "шестисотого",
            7: "семисотого",
            8: "восьмисотого",
            9: "девятисотого",
        }
        
        year_hunds_text = {
            0: "",
            1: "сто ",
            2: "двести ",
            3: "триста ",
            4: "четыреста ",
            5: "пятьсот ",
            6: "шестьсот ",
            7: "семьсот ",
            8: "восемьсот ",
            9: "девятьсот ",
        }
        
        year_full_tens_text = {
            1: "десятого",
            2: "двадцатого",
            3: "тридцатого",
            4: "сорокового",
            5: "пятидесятого",
            6: "шестидесятого",
            7: "семидесятого",
            8: "восьмидесятого",
            9: "девяностого",
        }
        
        year_tens_text = {
            0: "",
            1: "",
            2: "двадцать ",
            3: "тридцать ",
            4: "сорок ",
            5: "пятьдесят ",
            6: "шестьдесят ",
            7: "семьдесят ",
            8: "восемдесят ",
            9: "девяносто ",
        }
        
        year_lowtens_text = {
            11: "одинадцатого",
            12: "двенадцатого",
            13: "тринадцатого",
            14: "четырнадцатого",
            15: "пятнадцатого",
            16: "шестнадцатого",
            17: "семнадцатого",
            18: "восемнадцатого",
            19: "девятнадцатого",
        }
        
        year_ones_text = {
            1: "первого",
            2: "второго",
            3: "третьего",
            4: "четвертого",
            5: "пятого",
            6: "шестого",
            7: "седьмого",
            8: "восьмого",
            9: "девятого",
        }
        
        year_text = ""
        year = self.dateTime.year;
        
        if year%1000 == 0:
            year_text = year_full_ths_text[year//1000]
        else:
            year_text = year_ths_text[year//1000];
            if year%100 == 0:
                year_text += year_full_hunds_text[(year-(year//1000)*1000)//100]
            else:
                year_text += year_hunds_text[(year-(year//1000)*1000)//100]

                if year%10 == 0:
                    year_text += year_full_tens_text[(year-(year//100)*100)//10]
                else:
                    year_text += year_tens_text[(year-(year//100)*100)//10]
                
                    if 10<(year-(year//100)*100)<20:
                        year_text += year_lowtens_text[(year-(year//100)*100)]
                    else:
                        year_text += year_ones_text[(year-(year//10)*10)]
                
        return year_text
        
        
    def num_text(self,num,minute):
        num_tens_text = {
            0: "ноль",
            1: "десять",
            2: "двадцать",
            3: "тридцать",
            4: "сорок",
            5: "пятьдесят",
            6: "шестьдесят"
        }
        
        num_lowtens_text = {
            11: "одинадцать",
            12: "двенадцать",
            13: "тринадцать",
            14: "четырнадцать",
            15: "пятнадцать",
            16: "шестнадцать",
            17: "семнадцать",
            18: "восемнадцать",
            19: "девятнадцать",
        }
        
        num_ones_text = {
            0: "ноль",
            1: "одна",
            2: "две",
            3: "три",
            4: "четыре",
            5: "пять",
            6: "шесть",
            7: "семь",
            8: "восемь",
            9: "девять",
        }
        
        if minute==1:
            num_text = " минут"
        else:
            num_text = " секунд"
       
        if num%10 == 0:
            num_text = num_tens_text[num//10] + num_text
        else:        
            if 10<(num)<20:
                num_text = num_lowtens_text[num] + num_text
            else:
                if num<10:
                    num_text = num_ones_text[num] + num_text
                    if num == 1:
                        num_text += "а"
                    if num in [2, 3, 4]:
                        num_text += "ы"
                else:
                    num_text = num_tens_text[num//10]+" "+num_ones_text[num-((num//10)*10)] + num_text
                    if (num-((num//10)*10)) == 1:
                        num_text += "а"
                    if (num-((num//10)*10)) in [2, 3, 4]:
                        num_text += "ы"
                
            
        return num_text
   
    def convert(self): 
        days_text = {
            1: "первое",
            2: "второе",
            3: "третье",
            4: "четвертое",
            5: "пятое",
            6: "шестое",
            7: "седьмое",
            8: "восьмое",
            9: "девятое",
            10: "десятое",
            11: "одиннадцатое",
            12: "двенадцатое",
            13: "тринадцатое",
            14: "четырнадцатое",
            15: "пятнадцатое",
            16: "шестнадцатое",
            17: "семнадцатое",
            18: "восемнадцатое",
            19: "девятнадцатое",
            20: "двадцатое",
            21: "двадцать первое",
            22: "двадцать второе",
            23: "двадцать третье",
            24: "двадцать четверое",
            25: "двадцать пятое",
            26: "двадцать шестое",
            27: "двацать седьмое",
            28: "двадцать восьмое",
            29: "двадцать девятое",
            30: "тридцатое",
            31: "тридцать первое"
        }

        months_text = {
            1: "января",
            2: "февраля",
            3: "марта",
            4: "апреля",
            5: "мая",
            6: "июня",
            7: "июля",
            8: "августа",
            9: "сентября",
            10: "октября",
            11: "ноября",
            12: "декабря"
        }
        
        hour_text = {
            0: "ноль часов",
            1: "один час",
            2: "два часа",
            3: "три часа",
            4: "четыре часа",
            5: "пять часов",
            6: "шесть часов",
            7: "семь часов",
            8: "восемь часов",
            9: "девять часов",
            10: "десять часов",
            11: "одинадцать часов",
            12: "двенадцать часов",
            13: "тринадцать часов",
            14: "черытнадцать часов",
            15: "пятнадцать часов",
            16: "шестнадцать часов",
            17: "семьнадцать часов",
            18: "восемнадцать часов",
            19: "девятнадцать часов",
            20: "двадцать часов",
            21: "двадцать один час",
            22: "двадцать два часа",
            23: "двадцать три часа",
            24: "двадцать чатыре часа"
        }
    
        self.returnText = days_text[self.dateTime.day]+ " " +months_text[self.dateTime.month]+ " " +self.year_text()+ " года, "+hour_text[self.dateTime.hour]+" "+self.num_text(self.dateTime.minute,1)+" "+self.num_text(self.dateTime.second,0);
        return self.returnText
        


if __name__ == '__main__':
    res1 = DateToTextClass('01.01.2000 00:00:00')
    assert res1.convert() == "первое января двухтысячного года, ноль часов ноль минут ноль секунд", 'ошибка в тестовом примере 1'
    
    res1 = DateToTextClass('15.02.2012 01:12:59')
    assert res1.convert() == "пятнадцатое февраля две тысячи двенадцатого года, один час двенадцать минут пятьдесят девять секунд", 'ошибка в тестовом примере 2'
    
    res1 = DateToTextClass('31.03.3030 09:30:35')
    assert res1.convert() == "тридцать первое марта три тысячи тридцатого года, девять часов тридцать минут тридцать пять секунд", 'ошибка в тестовом примере 3'
    
    res1 = DateToTextClass('20.04.1001 12:01:01')
    assert res1.convert() == "двадцатое апреля одна тысяча первого года, двенадцать часов одна минута одна секунда", 'ошибка в тестовом примере 4'
    
    res1 = DateToTextClass('23.05.9999 23:13:16')
    assert res1.convert() == "двадцать третье мая девять тысяч девятьсот девяносто девятого года, двадцать три часа тринадцать минут шестнадцать секунд", 'ошибка в тестовом примере 5'
    
    res1 = DateToTextClass('30.12.8300 10:01:12')
    assert res1.convert() == "тридцатое декабря восемь тысяч трехсотого года, десять часов одна минута двенадцать секунд", 'ошибка в тестовом примере 6'
    
    print("Ready! 8-)")