class SubmitNote:
    """The following can be used to submit a note"""

    def __init__(self, access_course, access_note, access_user, access_enrollment):
        """ to initialize a submit note instance """
        self.access_course = access_course
        self.access_note = access_note
        self.access_user = access_user
        self.access_enrollment = access_enrollment
        self.searcher = Searcher(self.access_course, self.access_note, self.access_user)
        self.userControl = userControl = UserControl(self.access_user, self.access_enrollment)

    """in later iterations we will add a userID, and a file directly fileID, for now they are the same as a note"""

    def submit_note(self, start_date, end_date, notes, user_id, department, number, section=None):
        possible_courses = self.searcher.search_courses(
            CourseSearchParams(department=department, number=number, section=section)
        )

        user = self.access_user.get_user(user_id)

        if len(possible_courses) == 1 and (
            user.role == User.ROLE_ADMIN
            or (
                user.role == User.ROLE_SUBMITTER
                and self.userControl.is_user_enrolled(user_id, possible_courses[0].id) == True
            )
        ):
            notesUploadFile = self.access_note.store_notes_file(notes.file, notes.filename)

            note = Note(start_date, end_date, notesUploadFile, possible_courses[0].id, user_id, datetime.now())
            """with our note object created, submit to our db."""
            """our note is submitted"""
            return self.access_note.insert_note(note)
        else:
            # was not able to submit note
            return None

    def update_note_file(self, note_id, user_id, notes):
        user = self.access_user.get_user(user_id)
        note = self.access_note.get_note(note_id)
        note.notes = self.access_note.store_notes_file(notes.file, notes.filename)
        note.modified_by = user_id
        note.modified_on = datetime.now()
        return self.access_note.update_note(note)

    def remove_note(self, note_id):
        return self.access_note.delete_note(note_id)