@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

autonumber

'hide footbox
actor "Human Resources Manager" as ADM
participant ":RegisterSkillsUI" as UI
participant ":RegisterSkillsController" as CTRL
participant "Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant "skillRepository:\nSkillRepository" as SkillRepository
'participant ":ApplicationSession" as _APP
'participant "appSession\n:ApplicationSession" as APP
'participant "currentSession\n:UserSession" as SESSAO
participant "organizationRepository:\nOrganizationRepository" as OrganizationRepository
participant "organization\n:Organization" as ORG
participant "skill\n:Skill" as SKILL

activate ADM

        ADM -> UI : asks to register skills

        activate UI

            'UI --> ADM : requests data (i.e. skill name, description)
            'create CTRL
            UI -> CTRL** : create

            UI -> CTRL : getSkill()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getSkillRepository()
                activate PLAT

                    PLAT --> CTRL: skillRepository
                deactivate PLAT

'                CTRL -> SkillRepository : getSkill()
'                activate SkillRepository
'
'                    SkillRepository --> CTRL : skillCategoryList
'                deactivate SkillRepository
'
'                CTRL --> UI : skillCategoryList
'            deactivate CTRL
'
'            UI --> ADM : shows skill category list\n and asks to select one
'        deactivate UI
'
'    ADM -> UI : selects a skill category
'    activate UI

        UI --> ADM : requests data
    deactivate UI

    ADM -> UI : types requested data (skill name)
    activate UI

        UI --> ADM : shows requested data
    deactivate UI

    ADM -> UI : submits data
    activate UI

        UI -> CTRL : registerSkill(name)
        activate CTRL

            CTRL -> CTRL : getSkillByDescription(skillDescription)
            activate CTRL

'                CTRL -> RepositorySingleton : getInstance()
'                activate RepositorySingleton
'
'                    RepositorySingleton --> CTRL: repositories
'                deactivate RepositorySingleton

                CTRL -> PLAT : getSkillRepository()
                activate PLAT

                    PLAT -> CTRL : skillRepository
                deactivate PLAT

                CTRL -> SkillRepository : getSkillByDescription(skillDescription)
                activate SkillRepository

'                    SkillRepository --> CTRL : skillCategory
'                deactivate SkillRepository
'                    CTRL --> CTRL : skillCategory
'            deactivate CTRL

            |||
            CTRL -> CTRL : getEmployeeFromSession()
            activate CTRL

'                CTRL -> _APP: getInstance()
                'activate _APP
                 '   _APP -> CTRL: appSession
                'deactivate _APP


                'CTRL -> APP: getCurrentSession()
               ' activate APP

                  '  APP --> CTRL: currentSession
                'deactivate APP

'                CTRL -> SESSAO: email = getUserEmail()
'                'activate SESSAO
'
'                    SESSAO --> CTRL: email
'                'activate SESSAO


                CTRL -> PLAT: getOrganizationRepository(email)
                activate PLAT

                    PLAT --> CTRL: organizationRepository
                deactivate PLAT


                CTRL -> OrganizationRepository: getOrganizationByEmployeeEmail(email)
                activate OrganizationRepository

                    loop [for each organization
                        OrganizationRepository -> ORG : anyEmployeeHasEmail(email)
                        activate ORG

                             ORG --> OrganizationRepository : true/false
                        deactivate ORG
                    end
                    OrganizationRepository --> CTRL : organization
                deactivate OrganizationRepository

                CTRL -> ORG: getEmployeeByEmail(email)
                activate ORG

                    ORG --> CTRL : employee
                deactivate ORG

                CTRL --> CTRL : employee
            deactivate CTRL

            |||
            CTRL -> ORG: registerSkills(name)
            activate ORG

                ORG -> SKILL**: register(name)
                ORG -> ORG: addSkill (skill)


                activate ORG
                    ORG -> ORG: validateSkill(skill)

                ORG --> CTRL : skill

            deactivate ORG

            CTRL --> UI: skill
            deactivate CTRL
            UI --> ADM: displays operation success
    deactivate UI

deactivate ADM

@enduml