@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

autonumber

participant "Human Resources\n Manager" as Employee
participant ":AssignSkillsUI" as UI
participant ":AssignSkillsController" as CTRL
participant ":Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant "collaboratorRepository:\nCollaboratorRepository" as collaboratorRepository
participant "skillRepository:\nskillRepository" as skillRepository
participant "collaborator\n:Collaborator" as COLLAB

activate Employee

    Employee -> UI : asks to assign skills to a collaborator
    activate UI

        create CTRL
        UI -> CTRL** : create

        UI --> CTRL: getCollaboratorsList()
                activate CTRL

                CTRL--> CTRL: getCollaboratorsList()
                activate CTRL

                                 CTRL -> RepositorySingleton : getInstance()
                                 activate RepositorySingleton

                                 RepositorySingleton --> CTRL: repositories
                                 deactivate RepositorySingleton

                                 CTRL -> PLAT : getCollaboratorRepository()
                                 activate PLAT

                                 PLAT -> CTRL : collaboratorRepository
                                 deactivate PLAT

                                 CTRL -> collaboratorRepository : getCollaboratorsList()
                                 activate collaboratorRepository

                                 collaboratorRepository --> CTRL : collaboratorsList
                                 deactivate collaboratorRepository

                CTRL-->CTRL: collaboratorsList
                deactivate CTRL



                CTRL --> UI: collaboratorsList
                deactivate CTRL

    UI --> Employee : shows collaborators list and asks to select one
    deactivate UI

    Employee -> UI : selects a collaborator
    activate UI

    UI --> UI : keepCollaborator(ID)

        UI --> CTRL: getSkillsList()
        activate CTRL

            CTRL-->CTRL:getSkillsList()
            activate CTRL

             CTRL -> RepositorySingleton : getInstance()
                                        activate RepositorySingleton

                                        RepositorySingleton --> CTRL: repositories
                                        deactivate RepositorySingleton

                                        CTRL -> PLAT : getSkillRepository()
                                        activate PLAT

                                        PLAT -> CTRL : skillRepository
                                        deactivate PLAT

                                        CTRL -> skillRepository : getSkillsList()
                                        activate skillRepository

                                        skillRepository --> CTRL : skillsList
                                        deactivate skillRepository
             CTRL-->CTRL: skillsList
             deactivate CTRL

        CTRL --> UI: skillsList
        deactivate CTRL

loop while answer==False
    UI --> Employee : shows skills list and asks to select one
    deactivate UI

    Employee -> UI : selects a skill
    activate UI

    UI --> UI : addSkillToSet(name)

    UI -->Employee: ask if wants to continue to add skills

    Employee->UI: answer
end
    UI --> Employee : shows all data and requests confirmation
    deactivate UI

    Employee -> UI : confirms data
    activate UI

        UI --> CTRL: assignSkillsToCollaborator(skillsName,ID)
        activate CTRL



            CTRL-->CTRL: getSkillsByName(skillsName)
                        activate CTRL
loop for each skillName in skillsName
                            CTRL -> RepositorySingleton : getInstance()
                            activate RepositorySingleton

                            RepositorySingleton --> CTRL: repositories
                            deactivate RepositorySingleton

                            CTRL -> PLAT : getSkillRepository()
                            activate PLAT

                            PLAT -> CTRL : skillRepository
                            deactivate PLAT

                            CTRL -> skillRepository : getSkillByName(SkillName)
                            activate skillRepository

                            skillRepository --> CTRL : skill
                            deactivate skillRepository
end
            CTRL --> CTRL : skills
            deactivate CTRL

                CTRL-->CTRL: getCollaboratorByID(ID)
                 activate CTRL

                 CTRL -> RepositorySingleton : getInstance()
                 activate RepositorySingleton

                 RepositorySingleton --> CTRL: repositories
                 deactivate RepositorySingleton

                 CTRL -> PLAT : getCollaboratorRepository()
                 activate PLAT

                 PLAT -> CTRL : collaboratorRepository
                 deactivate PLAT

                 CTRL -> collaboratorRepository : getCollaboratorByID(ID)
                 activate collaboratorRepository

                 collaboratorRepository --> CTRL : collaborator
                 deactivate collaboratorRepository

            CTRL-->CTRL: collaborator
            deactivate CTRL

            CTRL --> collaboratorRepository: assignSkillsToCollaborator(skills,collaborator)
            activate collaboratorRepository

                collaboratorRepository --> COLLAB: addSkills(skills,collaborator)
                activate COLLAB

                COLLAB-->COLLAB: addSkills(skills)

                COLLAB-->collaboratorRepository:addSkills
                deactivate COLLAB

                collaboratorRepository-->collaboratorRepository: validateSkillsInCollaborator(collaborator)

            collaboratorRepository-->CTRL: addSkills
            deactivate collaboratorRepository
        CTRL-->UI: addSkills
        deactivate CTRL


    UI --> Employee : displays operation success
    deactivate UI



@enduml