Implement a class named PeerToPeerDeliverySystem. The deliverable item list is preconfigured and fixed. Customers and drivers are considered already onboarded based on totalUsers and totalDrivers.
dv-0, dv-1, ... dv-(totalDrivers-1).user-0, user-1, ... user-(totalUsers-1).PeerToPeerDeliverySystem(int totalUsers, int totalDrivers, List<String> deliverableItemIds)
user-(totalUsers-1).dv-(totalDrivers-1).deliverableItemIds is fixed for the lifetime of the system.String createOrder(String orderId, String customerId, String itemId)
customerId must be one of: user-0 ... user-(totalUsers-1).itemId must be one of the preconfigured deliverable items.String cancelOrder(String orderId)
CANCELED or ERROR if the order can't be cancelled.String pickUpOrder(String driverId, String orderId)
driverId must be one of: dv-0 ... dv-(totalDrivers-1).orderId must exist and must be currently assigned to this driver.PICKED_UP or ERROR if the order is not picked.String deliverOrder(String driverId, String orderId)
DELIVERED or ERROR.String getOrderStatus(String orderId)CREATED, ASSIGNED, PICKED_UP, DELIVERED, CANCELED.String getDriverStatus(String driverId)AVAILABLE, or BUSY:<orderId>.user-0 ... user-(totalUsers-1).dv-0 ... dv-(totalDrivers-1).CREATED -> ASSIGNED -> PICKED_UP -> DELIVEREDCREATED/ASSIGNED -> CANCELEDPICKED_UP, the order cannot be canceled.PeerToPeerDeliverySystem system = new PeerToPeerDeliverySystem(totalUsers = 3, totalDrivers = 2, deliverableItemIds = List.of("ITEM_1", "ITEM_2")) => systemsystem.createOrder(orderId = "O1", customerId = "user-0", itemId = "ITEM_1") => ACCEPTED (a driver was available, so the order was assigned immediately)system.getOrderStatus(orderId = "O1") => ASSIGNEDsystem.getDriverStatus(driverId = "dv-0") => BUSY:O1 (dv-0 is the lexicographically lowest available driver)system.getDriverStatus(driverId = "dv-1") => AVAILABLEsystem.pickUpOrder(driverId = "dv-0", orderId = "O1") => PICKED_UPsystem.cancelOrder(orderId = "O1") => ERROR (once PICKED_UP, the order cannot be canceled)system.deliverOrder(driverId = "dv-0", orderId = "O1") => DELIVEREDsystem.getDriverStatus(driverId = "dv-0") => AVAILABLEPeerToPeerDeliverySystem system = new PeerToPeerDeliverySystem(totalUsers = 2, totalDrivers = 1, deliverableItemIds = List.of("ITEM_A")) => systemsystem.createOrder(orderId = "O1", customerId = "user-0", itemId = "ITEM_A") => ACCEPTEDsystem.getDriverStatus(driverId = "dv-0") => BUSY:O1system.cancelOrder(orderId = "O1") => CANCELED (order was ASSIGNED but not PICKED_UP, so it can be canceled)system.getDriverStatus(driverId = "dv-0") => AVAILABLE (canceling an assigned-but-not-picked order frees the driver)system.pickUpOrder(driverId = "dv-0", orderId = "O1") => ERROR (canceled orders cannot be picked up)system.createOrder(orderId = "BAD1", customerId = "user-0", itemId = "UNKNOWN_ITEM") => INVALID (itemId is not in the preconfigured deliverableItemIds list)system.createOrder(orderId = "O2", customerId = "user-1", itemId = "ITEM_A") => ACCEPTED (dv-0 is available again, so O2 is assigned immediately)system.getOrderStatus(orderId = "O2") => ASSIGNEDsystem.getDriverStatus(driverId = "dv-0") => BUSY:O2PeerToPeerDeliverySystem system = new PeerToPeerDeliverySystem(totalUsers = 3, totalDrivers = 1, deliverableItemIds = List.of("X", "Y")) => systemsystem.createOrder(orderId = "O1", customerId = "user-0", itemId = "X") => ACCEPTEDsystem.pickUpOrder(driverId = "dv-0", orderId = "O1") => PICKED_UP (driver is now busy with O1)system.createOrder(orderId = "O2", customerId = "user-1", itemId = "Y") => PENDING (no driver available, so the order waits in the pending queue)system.createOrder(orderId = "O3", customerId = "user-2", itemId = "X") => PENDING (also queued after O2)system.getOrderStatus(orderId = "O2") => CREATED (created but not yet assigned)system.getOrderStatus(orderId = "O3") => CREATEDsystem.cancelOrder(orderId = "O3") => CANCELED (a CREATED/pending order can be canceled)system.deliverOrder(driverId = "dv-0", orderId = "O1") => DELIVERED (driver becomes available; next pending order is auto-assigned)system.getOrderStatus(orderId = "O2") => ASSIGNED (O2 was first in the pending queue, so it gets assigned before O3)system.getDriverStatus(driverId = "dv-0") => BUSY:O2system.pickUpOrder(driverId = "dv-0", orderId = "O3") => ERROR (O3 is canceled and also not assigned to dv-0)