@startuml Register

title Reference: [UC] Create Account

participant ":AuthController" as controller
participant ":UserManager" as userManager
participant ":Student" as student
participant ":Professor" as professor
participant ":EmailSender" as emailSender
participant ":FieldOfStudyRepository" as fieldOfStudyRepository

-> controller : RegisterJWTUser(dto.email, dto.password,\n\tdto.confirmPassword, dto.fieldOfStudy)
activate controller

alt Valid password
    alt Valid student email
        controller -> fieldOfStudyRepository: GetAsync(dto.fieldOfStudy)
        activate fieldOfStudyRepository
        fieldOfStudyRepository --> controller: fieldOfStudy
        deactivate fieldOfStudyRepository

        alt fieldOfStudy doesn't exist
            <-- controller: badRequest
        end

        controller -> student**: create(dto.Email, dto.Email, passwordHash, fieldofstudy.id)
        ' student --> controller: user
    else Valid professor email
        controller -> professor**: create(dto.Email, dto.Email, passwordHash, fieldofstudy.id)
    else Invalid email
        <-- controller: BadRequest
    end

    controller -> userManager: CreateAsync(user, dto.Password)
    activate userManager
    userManager --> controller: createResult
    deactivate userManager

    alt User creation succeeded
        controller -> userManager: AddToRoleAsync(user, role)
        activate userManager
        userManager --> controller: addResult
        deactivate userManager

        ' -> controller
        controller -> controller: SendConfirmationEmail
        activate controller
        
        controller -> userManager: GenerateEmailConfirmationTokenAsync(user)
        activate userManager
        userManager --> controller: token
        deactivate userManager
        
        controller -> emailSender: SendEmail(user.email, title... )
        activate emailSender
        emailSender --> controller: void | exception
        deactivate emailSender
        
        controller --> controller: void | exception
        deactivate controller

        alt no exception
            <-- controller: statusCode201
        else exception
            <-- controller: badRequest
        end
    else User creation failed
        <-- controller: badRequest
    end
else Bad password
    <-- controller: badRequest
end

deactivate controller

@enduml
