@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

autonumber

'hide footbox
actor "Human Resources\nManager" as HRM
participant ":AssignSkillsUI" as UI
participant ":AssignSkillsController" as CTRL
participant ":Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant "collaboratorRepository\n:CollaboratorRepository" as CollaboratorRepository
participant "skillRepository:\nSkillRepository" as SkillRepository
participant "skill\n:Skill" as SKILL
participant "collaborator\n:Collaborator" as COLLABORATOR

activate HRM

        HRM -> UI : asks to select a collaborator

        activate UI

'            UI --> HRM : requests data (reference, description,  informal \n description, technical description, duration, cost)
            'create CTRL
            UI -> CTRL : getCollaborators()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getCollaboratorRepository()
                activate PLAT

                    PLAT -> CTRL : collaboratorRepository
                deactivate PLAT

                CTRL -> CollaboratorRepository : getCollaborators()
                activate CollaboratorRepository

                    CollaboratorRepository -> CTRL : collaboratorList
                deactivate CollaboratorRepository

                CTRL --> UI : collaboratorList
            deactivate CTRL

            UI --> HRM : shows collaborator list and\nasks to select one

        deactivate UI

        HRM -> UI : selects one collaborator
        activate UI

            UI -> CTRL : getSkills()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getSkillRepository()
                activate PLAT

                    PLAT --> CTRL: skillRepository
                deactivate PLAT

                CTRL -> SkillRepository : getSkills()
                activate SkillRepository

                    SkillRepository --> CTRL : skillList
                deactivate SkillRepository

                CTRL --> UI : skillList
            deactivate CTRL

            UI --> HRM : shows skill list and asks\nto select one or more
        deactivate UI

    HRM -> UI : selects one or more skills
    activate UI

        UI --> HRM : shows selected skill(s)
    deactivate UI

    HRM -> UI : submits data
    activate UI

        UI -> CTRL : assignSkills(skillGroup)
        activate CTRL

            CTRL -> CTRL : getSkillByName(skillGroup)
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getSkillRepository()
                activate PLAT

                    PLAT -> CTRL : skillRepository
                deactivate PLAT

                loop  for each skill selected
                    CTRL -> SkillRepository : getSkillByName(skillName)
                    activate SkillRepository
                        loop for each skill
                            SkillRepository -> SKILL** : doesSkillExist(skillName)
                            activate SKILL

                                SKILL -> SkillRepository : true/false

                            deactivate SKILL

                        SkillRepository --> CTRL : skill
                        end
                    deactivate SkillRepository
                        CTRL --> CTRL : skill
                end
            deactivate CTRL

                        |||
            CTRL -> PLAT: assignSkills(skillGroup)
            activate PLAT

                PLAT -> COLLABORATOR**: assign(skillGroup)
                PLAT -> PLAT: updateCollaborator(collaborator)


                activate PLAT
                    PLAT -> PLAT: validateCollaborator(collaborator)
                    activate PLAT
                        PLAT --> PLAT
                    deactivate PLAT

                    PLAT --> PLAT
                deactivate PLAT

                PLAT --> CTRL : collaborator

            deactivate PLAT

            CTRL --> UI: collaborator
            deactivate CTRL
            UI --> HRM: displays operation success
    deactivate UI

deactivate HRM

@enduml