'''
Калькулятор дат предназначени для рассчета разницы дат хранения компонентов крови нашей лаборатории.
'''

# Импорт библиотек
from sys import exit as sys_exit
import datetime
from dateutil.relativedelta import relativedelta

# Задаем эталонные переменные
a = str('выход')
b = str('exit')
monthCounter = [ai for ai in range(1, 13)]
dayCounter = [bi for bi in range(1, 32)]
yearCounter = [ci for ci in range(1900, 2200)]

# Цикл проверки введенной даты ОТБОРА пробы
while True:
    try:
        dateSelect = input(
            'Дата отбора в формате ДД.ММ.ГГГГ(разделены точками):' '\n    ')
        if dateSelect in (a, b):
            sys_exit()
        else:
            if len(dateSelect) == 10:
                dayS, monthS, yearS = map(int, dateSelect.split('.'))
                if monthS in monthCounter and dayS in dayCounter and yearS in yearCounter:
                    dateS = datetime.date(day=dayS, month=monthS, year=yearS)
                else:
                    raise ValueError
            else:
                raise ValueError

    except (ValueError, NameError):
        print(
            'Дата ошибочна. Проверьте правильность введеной даты.')
        continue

# Цикл проверки введенной даты ИССЛЕДОВАНИЯ пробы
    while True:
        try:
            dateRelease = input(
                'Дата изготовления в формате ДД.ММ.ГГГГ(разделены точками):' '\n    ')
            if dateRelease in (a, b):
                sys_exit()
            else:
                if len(dateRelease) == 10:
                    dayR, monthR, yearR = map(int, dateRelease.split('.'))
                    if monthR in monthCounter and dayR in dayCounter and yearR in yearCounter:
                        dateR = datetime.date(
                            day=dayR, month=monthR, year=yearR)

#Вычисление разницы дат
                        diffDelta = relativedelta(dateS, dateR)

                        print('-----------------')
                        print('    Год(а):    ',
                              diffDelta.years)
                        print('    Месяца(ев):',
                              diffDelta.months)
                        print('    День(ей):  ',
                              diffDelta.days + 1)
                        print('-----------------')
                        print(
                            'Для изменения даты отбора перезапустите программу')
                        print('Для выхода наберите exit или выход')
                        print('=======================================')
                    else:
                        raise ValueError
                else:
                    raise ValueError
        except (ValueError, NameError):
            print(
                'Дата ошибочна. Проверьте правильность введеной даты.')
