@startuml

actor Student as user
participant EnrollmentRequestUI as ui
participant EnrollmentRequestController as ctrl

participant PersistenceContext as ctx
participant RepositoryFactory as rep_fac
participant CourseRepository as course_repo
participant EnrollmentRequestRepository as enrollment_request_repo
participant StudentRepository as student_repo

participant ListCoursesService as courses_svc

participant EnrollmentRequest as enrollment_request

user --> ui: enter

activate ui
    ui --> ctrl: create()
    activate ctrl
        ctrl --> ctx: repositories()
        activate ctx
            ctx --> rep_fac: create()
            activate rep_fac
            deactivate rep_fac
        deactivate ctx

        ctrl --> rep_fac: courses()
        activate rep_fac
            rep_fac --> course_repo: create()
            activate course_repo
            deactivate course_repo
        deactivate rep_fac

        ctrl --> rep_fac : enrollmentRequests()
        activate rep_fac
            rep_fac --> enrollment_request_repo: create()
            activate enrollment_request_repo
            deactivate enrollment_request_repo
        deactivate rep_fac

        ctrl --> rep_fac: students()
        activate rep_fac
            rep_fac --> student_repo: create()
            activate student_repo
            deactivate student_repo
        deactivate rep_fac
    deactivate ctrl

    ui --> ctrl: getCourses()
    activate ctrl
        ctrl --> courses_svc: enrollable(coursesRepository)
        activate courses_svc
            courses_svc --> course_repo: findByState()
            activate course_repo
            deactivate course_repo
        deactivate courses_svc

        ctrl --> ui: courses
    deactivate ctrl



    ui --> user: show courses
deactivate ui

user --> ui: selects course from list
activate ui
    ui --> ctrl: createEnrollmentRequest(course)
    activate ctrl
        ctrl --> student_repo: student = findBySystemUser()
        activate student_repo
        deactivate student_repo

        ctrl ---> enrollment_request: EnrollmentRequest = new EnrollmentRequest(course, student)
        note bottom: systemUser is taken from user session
        activate enrollment_request
        deactivate enrollment_request

        ctrl --> enrollment_request_repo: save(enrollmentRequest)
        activate enrollment_request_repo
        deactivate enrollment_request_repo
    deactivate ctrl

    ui --> user: show success message
deactivate ui
@enduml