import datetime class DataUI: # Filter for selections that allow def selectionChooser(self, fullList): print("Please make a selection") print(" [1]: Show all ") print(" [2]: Show per truck") print(" [3]: Show package") SubMenuTreeSelection = input("") selection = [] if "1" in SubMenuTreeSelection: selection = fullList if "2" in SubMenuTreeSelection: print("Choose a truck ID [1,2,3]") choice = input("") for pkg in fullList: if choice in pkg.truckId: selection.append(pkg) if "3" in SubMenuTreeSelection: print("Choose a package ID [0..39]") choice = input("") for pkg in fullList: if choice == str(pkg.id): selection.append(pkg) return selection # Shows information about trucks def Trucks(self, truck1, truck2, truck3): trucks = [truck1, truck2, truck3] print("") for i,v in enumerate(trucks): startTime = "Pending" endTime = "Pending" if v.startTime != None: startTime = v.startTime.strftime('%H:%M') if v.packages.count == 0: endTime = v.getTimeOfDay().strftime('%H:%M') print(f"Truck [{v.id}] | " f"Mileage: {v.mileage:.2f} | " f"Departure: {startTime} | " f"Arrival: {endTime} | " f"DriveTime: {v.getDriveTime()} mintes") print("") # Shows information about packages def Packages(self, package_hash): selection = self.selectionChooser(package_hash) print("") for i,v in enumerate(selection): print(f"[{v.id:2}] | " f"[DeliveryNumber]: {v.deliveryNumber:2} | " f"[onTruck]: {v.truckId:2} | " f"[Address]: {v.address[:20]:20} | " f"[Status]: {v.status:10} | " f"[Note]: {v.notes:10}") print("") # Shows information about delivery times and deadlines def DeliveryTime(self, package_hash): selection = self.selectionChooser(package_hash) print("") for i,v in enumerate(selection): deadline = v.deadline metDeadline = "False" if isinstance(v.deadline, datetime.time): deadline = v.deadline.strftime('%H:%M') if v.timeStart != None and v.timeEnd != None: if v.timeEnd <= v.deadline: metDeadline = "True" if v.deadline == datetime.time(23,59): deadline = "EOD" startTime = "Pending" if v.timeStart != None: startTime = v.timeStart.strftime('%H:%M') endTime = "Pending" if v.timeEnd != None: endTime = v.timeEnd.strftime('%H:%M') print(f"[{v.id:2}] | " f"[StartTime]: {startTime:8} | " f"[DelivedTime]: {endTime:8} | " f"[Deadline]: {deadline:8} | " f"[MetDeadline]: {metDeadline:5} | " f"[Note]: {v.notes:10}") print("") # Main prompt for the UI def MainSelectionPrompt(self, truck1, truck2, truck3, package_hash): while True: print("Please make a selection") print(" [1]: Show stats for trucks") print(" [2]: Show stats for packages") print(" [3]: Check delivery times") print(" [4]: Total Mileage for trucks") print(" [5]: Cancel") MenuTreeSelection = input("") if "1" in MenuTreeSelection: self.Trucks(truck1, truck2, truck3) elif "2" in MenuTreeSelection: self.Packages(package_hash) elif "3" in MenuTreeSelection: self.DeliveryTime(package_hash) elif "4" in MenuTreeSelection: totalDistance = truck1.mileage + truck2.mileage + truck3.mileage print(f"\nTotal Mileage for all trucks: {totalDistance:.2f} miles\n") elif "5" in MenuTreeSelection: break # Prompt for pausing the simulation and opening the menu for stats at specific times def TimePrompt(self, currentTime: datetime.time, truck1, truck2, truck3, package_hash) -> datetime.time: while True: print(" [1]: Pause the simulation at a point in time") print(" [2]: Run the simulation to the end") print(" [3]: View stats for this moment in time") selectionInput = input("") if "1" in selectionInput: while True: print("Please input a time in format of [hh:mm] or type 'back' to return to menu") timeInput = input("") if timeInput.lower() == 'back': break try: time = timeInput.split(":") hour = int(time[0]) minute = int(time[1]) chosenTime = datetime.time(hour, minute) if chosenTime > currentTime: print(f"Simulation set to pause at {hour:02}:{minute:02}") return chosenTime else: print(f"Error: Time must be later than {currentTime.strftime('%H:%M')}.") except ValueError: print(f"Invalid format '{timeInput}'. Use HH:MM (e.g., 10:30).") elif "2" in selectionInput: print("Running simulation until the end of the day.") return datetime.time(23, 59) elif "3" in selectionInput: self.MainSelectionPrompt(truck1, truck2, truck3, package_hash) else: print("Invalid selection. Please choose 1, 2, or 3.")