class Row:
    def get_info(self, default: str = None) -> str:
        raise NotImplementedError()


class DateRow(Row):
    def get_info(self, default: str = None) -> str:
        while True:
            user_input = input("Введите дату (формат: ДД.ММ.ГГГГ): ")
            if not user_input:
                if default is not None:
                    return default
                print("Ошибка: Ввод не может быть пустым.")
                continue
            
            if self.is_valid_date(user_input):
                return user_input
            print("Ошибка: Неверный формат даты, попробуйте еще раз.")

    def is_valid_date(self, date_str: str) -> bool:
        parts = date_str.split('.')
        if len(parts) != 3:
            return False
        day, month, year = parts
        return day.isdigit() and month.isdigit() and year.isdigit()


class TextRow(Row):
    def get_info(self, default: str = None) -> str:
        while True:
            user_input = input("Введите текст (максимум 50 символов): ")
            if not user_input:
                if default is not None:
                    return default
                print("Ошибка: Ввод не может быть пустым.")
                continue
            
            if len(user_input) <= 50:
                return user_input
            print("Ошибка: Превышена максимальная длина текста, попробуйте еще раз.")


class IntegerRow(Row):
    def get_info(self, default: str = None) -> int:
        while True:
            user_input = input("Введите целое число: ")
            if not user_input:
                if default is not None:
                    return int(default)
                print("Ошибка: Ввод не может быть пустым.")
                continue
            
            try:
                value = int(user_input)
                return value
            except ValueError:
                print("Ошибка: Неверный ввод, попробуйте еще раз.")


class GradeRow(IntegerRow):
    def get_info(self, default: str = None) -> int:
        while True:
            user_input = input("Введите оценку (от 2 до 5): ")
            if not user_input:
                if default is not None:
                    return int(default)
                print("Ошибка: Ввод не может быть пустым.")
                continue
            
            try:
                value = int(user_input)
                if 2 <= value <= 5:
                    return value
                print("Ошибка: Оценка должна быть от 2 до 5, попробуйте еще раз.")
            except ValueError:
                print("Ошибка: Неверный ввод, попробуйте еще раз.")