@startuml
!include style.puml
skinparam arrowThickness 1.1
skinparam arrowColor MODEL_COLOR
skinparam classBackgroundColor MODEL_COLOR

Package Model as ModelPackage <<Rectangle>>{
Class "<<interface>>\nReadOnlyAddressBook" as ReadOnlyAddressBook
Class "<<interface>>\nReadOnlyUserPrefs" as ReadOnlyUserPrefs
Class "<<interface>>\nModel" as Model
Class AddressBook
Class ModelManager
Class UserPrefs

Class UniquePersonList
Class Person
Class UniqueMeetingList
Class Meeting
Class Address
Class Email
Class Name
Class Phone
Class Tag

Class I #FFFFFF
}

Class HiddenOutside #FFFFFF
HiddenOutside ..> Model

AddressBook .up.|> ReadOnlyAddressBook

ModelManager .up.|> Model
Model .right.> ReadOnlyUserPrefs
Model .left.> ReadOnlyAddressBook
ModelManager -left-> "1" AddressBook
ModelManager -right-> "1" UserPrefs
UserPrefs .up.|> ReadOnlyUserPrefs

AddressBook *--> "1" UniquePersonList
UniquePersonList --> "~* all" Person
Person *--> Name
Person *--> Phone
Person *--> Email
Person *--> Address
Person *--> "*" Tag
Person *--> "*" Meeting

Meeting *--> Description
Meeting *--> DateTime
Meeting *--> Person

AddressBook *--> "1" UniqueMeetingList
UniqueMeetingList --> "~* all" Meeting

Person -[hidden]up--> I
UniquePersonList -[hidden]right-> I

Name -[hidden]right-> Phone
Phone -[hidden]right-> Address
Address -[hidden]right-> Email

Person "1" -- "0..*" Meeting

' AddMeetingCommand Class and its relation to Meeting
Class AddMeetingCommand {
    +execute(): CommandResult
}
AddMeetingCommand ..> Meeting : creates
EditMeetingCommand ..> Meeting : edits

ModelManager --> "~* filtered" Person
ModelManager --> "~* filtered" Meeting
@enduml
