@startuml
'https://plantuml.com/class-diagram

!include style.puml

box Logic LOGIC_COLOR_T1
participant ":LogicManager" as LogicManager LOGIC_COLOR
participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
participant ":ScheduleCommandParser" as ScheduleCommandParser LOGIC_COLOR
participant ":AddScheduleCommandParser" as AddScheduleCommandParser LOGIC_COLOR
participant "a:AddScheduleCommand" as AddScheduleCommand LOGIC_COLOR
end box

box Model MODEL_COLOR_T1
participant ":Model" as Model MODEL_COLOR
participant "l:List<Candidate>" as lastShownCandidateList MODEL_COLOR
participant ":Candidate" as Candidate MODEL_COLOR
participant "toAdd:Interview" as Interview MODEL_COLOR
end box

[-> LogicManager : execute("schedule add ...")
activate LogicManager

LogicManager -> AddressBookParser : parseCommand("schedule add ..."))
activate AddressBookParser

create ScheduleCommandParser
AddressBookParser -> ScheduleCommandParser
activate ScheduleCommandParser

ScheduleCommandParser --> AddressBookParser
deactivate ScheduleCommandParser

AddressBookParser -> ScheduleCommandParser : parse(arguments)
activate ScheduleCommandParser

create AddScheduleCommandParser
ScheduleCommandParser -> AddScheduleCommandParser
activate AddScheduleCommandParser

AddScheduleCommandParser --> ScheduleCommandParser
deactivate AddScheduleCommandParser

ScheduleCommandParser -> AddScheduleCommandParser : parse(args)
activate AddScheduleCommandParser

create AddScheduleCommand
AddScheduleCommandParser -> AddScheduleCommand
activate AddScheduleCommand

AddScheduleCommand --> AddScheduleCommandParser : a
deactivate AddScheduleCommand

AddScheduleCommandParser --> ScheduleCommandParser : a
deactivate AddScheduleCommandParser

AddScheduleCommandParser -[hidden]-> AddressBookParser
destroy AddScheduleCommandParser

ScheduleCommandParser --> AddressBookParser : a
deactivate ScheduleCommandParser

ScheduleCommandParser -[hidden]-> AddressBookParser
destroy ScheduleCommandParser

AddressBookParser --> LogicManager : a
deactivate AddressBookParser

LogicManager -> AddScheduleCommand : execute()
activate AddScheduleCommand

AddScheduleCommand -> Model : getFilteredCandidateList()
activate Model

create lastShownCandidateList
Model -> lastShownCandidateList
activate lastShownCandidateList

lastShownCandidateList --> Model : l
deactivate lastShownCandidateList

Model --> AddScheduleCommand : l
deactivate Model

AddScheduleCommand -> lastShownCandidateList : get(index)
activate lastShownCandidateList

lastShownCandidateList -> Candidate
activate Candidate

Candidate --> lastShownCandidateList : candidateToInterview
deactivate Candidate

lastShownCandidateList --> AddScheduleCommand : candidateToInterview
deactivate lastShownCandidateList

lastShownCandidateList -[hidden]-> AddScheduleCommand
destroy lastShownCandidateList

AddScheduleCommand -> Candidate : triggerInterviewStatusScheduled()
activate Candidate

Candidate --> AddScheduleCommand : editedCandidate
deactivate Candidate

create Interview
AddScheduleCommand -> Interview : Interview(candidateToInterview, interviewDateTime)
activate Interview

Interview --> AddScheduleCommand : toAdd
deactivate Interview

AddScheduleCommand -> Model : addInterview(toAdd)
activate Model

Model --> AddScheduleCommand
deactivate Model

AddScheduleCommand -> Model : setCandidate(candidateToInterview, editedCandidate)
activate Model

Model --> AddScheduleCommand
deactivate Model

AddScheduleCommand --> LogicManager : commandResult
deactivate AddScheduleCommand

AddScheduleCommand -[hidden]-> LogicManager
destroy AddScheduleCommand

[<--LogicManager
deactivate LogicManager
@enduml

enum TimeUnit {
DAYS
HOURS
MINUTES
}

@enduml