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

class Duke {

}

class MainController {

}
Controller <|-- MainController
DishController "1" <-- MainController: have <

abstract class Controller {

}


class Dish {
    -name: String
    -price: double
    +Dish(String, double)
    +getName(): String
    +setName(): void
    +getPrice(): double
    +setPrice(double): void
    +toString(): String
    -isValidName(String): boolean
    -toTitleCase(String): String
}

class DishManager {
    -dishes: ArrayList<Dish>
    +DishManager()
    +addDish(Dish): void
    +deleteDish(int): void
    +printDishes(): void
    +setName(int, String): void
    +setPrice(int, double): void
    +getNumOfDishes(): int
    -throwIfIndexNotValid(int): void
}
Controller <|-- DishController


class DishController {
    -CHOICES: String[]
    -dishManager: DishManager
    +DishController()
    -addDish(): void
    -changeName(): void
    -changePrice(): void
    -deleteDish(): void
    -listDishes(): void
    #optionSwicher(int): boolean
    +takeControl(): void
}


Dish "0..*" <-- DishManager: manages <

DishManager "1" <-- DishController: have <


class Order {
    -dishes: List<Dish>
    +Order(List<Dish>)
    +addDishToOrder(Dish): void
    +removeDishFromOrderByIndex(int): void
    +getOrderLength(): int
    +getTotalPrice(): double
}

class OrderManager {
    -orders: ArrayList<Order>
    -dishManager: DishManager
    -dishes: ArrayList<Dish>
    +OrderManager()
    +addOrder(Order): void
    +addDishToOrder():
    +deleteOrder(int): void
    +getOrderPrice(int): double
    +getAllOrderValue(): double
    +printReceipt(): void
    +getOrders(): ArrayList<Order>
    +getDishesFromOrder(): ArrayList<Dish>

}
Controller <|-- OrderController


class OrderController {
    -CHOICES: String[]
    -orderManager: OrderManager
    +OrderController()
    -addOrder(): void
    -deleteOrder(): void
    -getOrderPrice(): void
    -getAllOrderPrice(): void
    -printReceipt(): void
    #optionSwicher(int): boolean
    +takeControl(): void
}


Order "0..*" <-- OrderManager: manage <

OrderManager "1" <-- OrderController: have <

Dish "0..*" <-- Order: have <


@enduml
