@startuml
class VoyaTrip

class Ui{
    + run(): void
}

class Parser

class Trip{
    - destination: String
    - totalBudget: Integer
    - numDays: Integer
    + Trip(destination: String, startDate: String, endDate: String, totalBudget: Integer)
    + addItinerary(day: Integer, name: String, budget: Integer): void
    + addAccommodation(name: String, budget: Integer): void
    + deleteAccommodation(index: Integer): void
    + addTransportation(mode: String, budget: Integer): void
    + deleteTransportation(index: Integer): void
    + toString(){redefines toString()}: String
}

class LocalDate

abstract class Command {
    - keyword: String
}

class AccommodationCommand
class TransportationCommand
class ItineraryCommand
class TripCommand

class Day{
    - budget: Integer
    + Day()
    + addActivity(name: String, budget Integer): void
    + toString(){redefines toString()}: String
}

class Activity{
    - name: String
    - time: String
    + Activity(name: String, time: Integer)
    + toString(){redefines toString()}: String
}

class Accommodation{
    - name: String
    - budget: Integer
    + Accommodation(name: String, budget: Integer)
    + toString(){redefines toString()}: String
}

class Transportation{
    - mode: String
    - budget: Integer
    + Transportation(mode: String, budget: Integer)
    + toString(){redefines toString()}: String
}

VoyaTrip --> "*" Trip : - trips: ArrayList<Trip>
VoyaTrip *-- "1" Ui : -ui

Ui --> "0..1" Command : -command
Ui --> "*" Trip : - trips: ArrayList<Trip>
(Ui, Command) .. Parser

AccommodationCommand --|> Command
TransportationCommand --|> Command
ItineraryCommand --|> Command
TripCommand --|> Command

Trip --> "1" LocalDate : - startDate
Trip --> "1" LocalDate : - endDate
Trip --> "0..numDays" Day : - itineraries: ArrayList<Day>
Day --> "*" Activity : - activities: ArrayList<Activity>
Trip --> "*" Accommodation : - accommodations: ArrayList<Accommodation>
Trip --> "*" Transportation : - transportations: ArrayList<Transportation>


@enduml