class Assignment_controller:
    '''
    classdocs
    '''
    def __init__(self, repository):
        '''
        Constructor
        '''
        self.__assign_repository = Assignment_repository()
        self.__assign_validator = Assignment_validator()

    def add_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.add_assignment(assign)

    def add_sample_data(self):
        self.add_assignment(1, "ass1", "20 1 2020", 2)
        self.add_assignment(2, "ass2", "21 1 2020", 2)
        self.add_assignment(3, "ass3", "22 1 2020", 2)
        self.add_assignment(4, "ass4", "23 1 2020", 2)
        self.add_assignment(5, "ass5", "24 1 2020", 2)
        self.add_assignment(6, "ass6", "25 1 2020", 2)
        self.add_assignment(7, "ass7", "26 1 2020", 2)
        self.add_assignment(8, "ass8", "27 1 2020", 2)
        self.add_assignment(9, "ass9", "28 1 2020", 2)
        self.add_assignment(10, "ass10", "29 1 2020", 2)

    def update_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.update_assignment(assign)

    def remove_assignment_by_id(self, assign_id):
        self.__assign_repository.remove_assignment_by_id(assign_id)

    def find_assignment_by_id(self, assign_id):
        assign_with_id = self.__assign_repository.find_assignment(assign_id)
        return assign_with_id

    def assignments_length(self):
        return self.__assign_repository.assignments_length()

    def list_all_assignments(self):
        return self.__assign_repository.list_all_assignments()
class Assignment_controller:
    '''
    classdocs
    '''
    def __init__(self, repository):
        '''
        Constructor
        '''
        self.__assign_repository = Assignment_repository()
        self.__assign_validator = Assignment_validator()

    def add_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.add_assignment(assign)

    def update_assignment(self, assign_id, description, deadline):
        assign = Assignment(assign_id, description, deadline)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.update_assignment(assign)

    def remove_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repo.remove_assignment(assign)

    def remove_assignment_by_id(self, assign_id):
        self.__assign_repository.remove_assignment(assign_id)

    def find_assignment_by_id(self, assign_id):
        return self.__assign_repository.find_assignment(assign_id)

    def assignments_length(self):
        return self.__assign_repository.assignments_length()

    def list_all_assignments(self):
        return self.__assign_repository.list_all_assignments()
class Assignment_controller:
    '''
    Controls assignments repository
    '''

    def __init__(self, repository):
        '''
        Constructor
        '''

        self.__today = date.today()
        self.__assign_repository = repository
        self.__assign_validator = Assignment_validator()
        
    def add_assignment(self,assign_id,description,deadline,grade):
        '''
        Adds a new assignment to the repository after validating its properties
        Input:
        :param assign_id
        :param description
        :param deadline
        :param grade
        '''
        
        assign = Assignment(assign_id,description,deadline,grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.add_assignment(assign)
        
    def add_sample_data(self):
        '''
        Adds sample assignments to the repository
        '''
        
        self.add_assignment(1,"ass1","20 1 2013",2)
        self.add_assignment(2,"ass2","21 1 2014",2)
        self.add_assignment(3,"ass3","22 1 2015",2)
        self.add_assignment(4,"ass4","23 1 2016",2)
        self.add_assignment(5,"ass5","24 1 2017",2)
        self.add_assignment(6,"ass6","25 1 2018",2)
        self.add_assignment(7,"ass7","26 1 2019",2)
        self.add_assignment(8,"ass8","27 1 2020",2)
        self.add_assignment(9,"ass9","28 1 2021",2)
        self.add_assignment(10,"ass10","29 1 2022",2)
        1
    def update_assignment(self,assign_id,description,deadline,grade):
        '''
        Updates an assignment from the repository after validating its new properties
        Input:
        :param assign_id
        :param description
        :param deadline
        :param grade
        '''
        
        assign = Assignment(assign_id,description,deadline,grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.update_assignment(assign)
         
    def remove_assignment_by_id(self,assign_id):
        '''
        Removes the assignment with the given ID from the repository
        Input:
        :param assign_id
        '''
        
        self.__assign_repository.remove_assignment_by_id(assign_id)
        
    def find_assignment_by_id(self,assign_id):
        '''
        Finds the assignment with the given ID
        Input:
        :param assign_id
        Output:
        :return assign_with_id
        '''
        
        assign_with_id = self.__assign_repository.find_assignment(assign_id)
        return assign_with_id        
    
    def assignments_length(self):
        '''
        Returns the number of assignments
        Output:
        :return self.__assign_repository.assignments_length()
        '''
        
        return self.__assign_repository.assignments_length()
        
    def list_all_assignments(self):
        '''
        Makes a list containing all assignments
        Output:
        :return self.__assign_repository.list_all_assignments()
        '''
        
        return self.__assign_repository.list_all_assignments()
    
    def find_id(self,assign_id):
        '''
        Check if the assignment with the given ID exists
        Input:
        :param assign_id
        Output:
        :return self.__assign_repository.find_id(assign_id)
        '''
        
        return self.__assign_repository.find_id(assign_id)
    
    def possible_late(self):
        '''
        Makes a list containing all IDs of assignments which have the deadline passed, so which could be late
        Output:
        :return possible_late
        '''
        
        possible_late = []
        for assign in self.__assign_repository.list_all_assignments():
            assign.deadline = assign.deadline.split(' ')
            assign_deadline = date(int(assign.deadline[2]), int(assign.deadline[1]), int(assign.deadline[0]))
            if self.__today > assign_deadline:
                possible_late.append(assign.assign_id)
        return possible_late
    
    def replace(self,new_repo):
        self.__assign_repository.replace(new_repo)
        
    def repo(self):
        return self.__assign_repository.repo
class Assignment_controller:
    '''
    classdocs
    '''
    def __init__(self, repository):
        '''
        Constructor
        '''
        self.__today = date.today()
        self.__assign_repository = Assignment_repository()
        self.__assign_validator = Assignment_validator()

    def add_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.add_assignment(assign)

    def add_sample_data(self):
        self.add_assignment(1, "ass1", "20 1 2013", 2)
        self.add_assignment(2, "ass2", "21 1 2014", 2)
        self.add_assignment(3, "ass3", "22 1 2015", 2)
        self.add_assignment(4, "ass4", "23 1 2016", 2)
        self.add_assignment(5, "ass5", "24 1 2017", 2)
        self.add_assignment(6, "ass6", "25 1 2018", 2)
        self.add_assignment(7, "ass7", "26 1 2019", 2)
        self.add_assignment(8, "ass8", "27 1 2020", 2)
        self.add_assignment(9, "ass9", "28 1 2021", 2)
        self.add_assignment(10, "ass10", "29 1 2022", 2)
        1

    def update_assignment(self, assign_id, description, deadline, grade):
        assign = Assignment(assign_id, description, deadline, grade)
        self.__assign_validator.validate_assignment(assign)
        self.__assign_repository.update_assignment(assign)

    def remove_assignment_by_id(self, assign_id):
        self.__assign_repository.remove_assignment_by_id(assign_id)

    def find_assignment_by_id(self, assign_id):
        assign_with_id = self.__assign_repository.find_assignment(assign_id)
        return assign_with_id

    def assignments_length(self):
        return self.__assign_repository.assignments_length()

    def list_all_assignments(self):
        return self.__assign_repository.list_all_assignments()

    def find_id(self, assign_id):
        return self.__assign_repository.find_id(assign_id)

    def possible_late(self):
        possible_late = []
        for assign in self.__assign_repository.list_all_assignments():
            assign.deadline = assign.deadline.split(' ')
            assign_deadline = date(int(assign.deadline[2]),
                                   int(assign.deadline[1]),
                                   int(assign.deadline[0]))
            if self.__today > assign_deadline:
                possible_late.append(assign.assign_id)
        return possible_late