@startuml
'skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false
skinparam linetype polyline
'skinparam linetype orto

skinparam classAttributeIconSize 0

'left to right direction

class ApplicationSession
{
    + static getInstance()
    + getCurrentSession()
}

class UserSession
{
    + getUserEmail()
}

class Skill {
    - name: String
}

class SkillRepository {
  - List<Skill> skills
  + Optional<Skill> add(Skill skill)
  + boolean validateSkill(Skill skill)
  + List<Skill> getSkills()
  + Skill getSkillByName(String name)
}

class Organization {
  - String name
  - String vatNumber
  - String address
  - String phone
  - String email
  + Optional<Skill> createSkill(String name)
  + boolean addSkill(Skill skill)
  + boolean validateSkill(Skill skill)
  + boolean skillsDoNotContain(Skill skill)
  + boolean equals(Object o)
}

class OrganizationRepository {
  + Optional<Organization> getOrganizationByHRM(HRM hrm)
  + Optional<Organization> getOrganizationByVFM(VFM vfm)
  + Optional<Organization> getOrganizationByHRMEmail(String email)
  + Optional<Organization> add(Organization organization)
  + boolean validateOrganization(Organization organization)
}

class Repositories {
  + getInstance() : Repositories
  + getSkillRepository() : SkillRepository
  + getOrganizationRepository() : OrganizationRepository
}

class CreateSkillController {
  + CreateJobController(OrganizationRepository organizationRepository,
                                   JobRepository jobRepository,
                                   AuthenticationRepository authenticationRepository)
  + Optional<Skill> createSkill(String name, HRM hrm)
}

class CreateSkillUI {
  + requestSkillName()
}

class HRM {
   - String name
   - int vatNumber
   - String email
   - int phonenumber
}

SkillManager --> Skill: Manages
HRM --> SkillManager: Uses

note right of CreateSkillController
  - Skill name is obtained from the HRM's input
  - Updates the Skill Repository
end note

note right of HRM
  - HRM initiates skill creation
end note

note left of CreateSkillUI
  - UI for HRM to input and confirm skill name
  - Communicates with CreateSkillController
end note

note left of Organization
  - Manages skills
  - Handles organizational details
end note

Repositories -> Repositories : instance
ApplicationSession -> ApplicationSession : instance

CreateSkillUI .> CreateSkillController

CreateSkillController -down-> Repositories : retrieves instances

Repositories -down-> SkillRepository : accesses
Repositories -down-> OrganizationRepository : accesses

CreateSkillController ..> OrganizationRepository : organizationRepository

OrganizationRepository --> "*" Organization : persists
ApplicationSession --> "1" UserSession : userSession

CreateSkillController ..> "1" Organization : organization
CreateSkillController ..> ApplicationSession
CreateSkillController ..> UserSession
Organization "1" --> "*" Skill : owns
Skill --> HRM : createdBy

Organization --> "*" HRM : employs

@enduml