#include "VenueConsoleUI.h" #include "List/OrderedList.hpp" #include "String/String.h" #include "Date/Date.h" #include "EventSystem/StatusCodes.h" #include "EventSystem/Reservation.h" #include "EventSystem/EventSystem.h" #include "ConsoleInterface/Menu.h" #include "ConsoleInterface/Toolbox.hpp" Venue* v; Menu mainMenu("FMI Ticket System", true, false), ticketManagementMenu("Ticket management", false, true), eventManagementMenu("Event management", false, true), reportsMenu("Report management", false, true); void handleStatusCode(StatusCode sc, Menu menu) { switch (sc) { case Success: menu.registerSuccess("Success!"); break; case W_TicketHadNotBeenReserved: menu.registerWarning("Ticket hadn't been reserved. Nothing changed."); break; case E_EventDoesNotExist: menu.registerError("Event doesn't exist!"); break; case E_TicketAlreadyBought: menu.registerError("Ticket was already bought!"); break; case E_TicketAlreadyReserved: menu.registerError("Ticket was already reserved!"); break; case E_ReservationDoesNotExist: menu.registerError("Reservation doesn't exist!"); break; case E_WrongReservationPassword: menu.registerError("Wrong reservation password!"); break; default: break; } } /* Ticket Management */ void command_freeSeats() { char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); const Hall* hall = v->get_es().queryEventHall(name, date); if (hall == nullptr) { handleStatusCode(E_HallDoesntExist, ticketManagementMenu); return; } OrderedList tickets = v->get_es().queryTickets(name, date); OrderedList reservations = v->get_es().queryReservations(name, date); unsigned tableSize = hall->get_rowCount() * hall->get_seatsPerRow(), nextTInd = 0, nextRInd = 0, nextT = 0, nextR = 0; if (tickets.get_count() > 0) nextT = (tickets[nextT].get_row() - 1) * hall->get_seatsPerRow() + tickets[nextT].get_seat() - 1; if (reservations.get_count() > 0) nextR = (reservations[nextR].get_ticket().get_row() - 1) * hall->get_seatsPerRow() + reservations[nextT].get_ticket().get_seat() - 1; char tableData[tableSize + 1]; for (unsigned i = 0; i < tableSize; i++) { if (nextTInd < tickets.get_count() && nextT == i) { tableData[i] = 'B'; nextTInd++; nextT = (tickets[nextT].get_row() - 1) * hall->get_seatsPerRow() + tickets[nextT].get_seat() - 1; } else if (nextRInd < reservations.get_count() && nextR == i) { tableData[i] = 'R'; nextRInd++; nextR = (reservations[nextR].get_ticket().get_row() - 1) * hall->get_seatsPerRow() + reservations[nextT].get_ticket().get_seat() - 1; } else tableData[i] = ' '; } tableData[tableSize] = '\0'; table(1, hall->get_seatsPerRow(), tableData); } void command_reserveTicket() { char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); char password[PASSWORD_LEN]; inputBox("Enter password [Max 8 characters]: ", &password); char note[NOTE_LEN]; inputBox("Enter note [Max 32 characters]: ", ¬e); Ticket tic; inputBox("Enter row and seat: ", &tic); handleStatusCode(v->get_es().reserveTicket(name, date, password, note, tic), ticketManagementMenu); } void command_cancelReservation() { char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); Ticket tic; inputBox("Enter row and seat: ", &tic); handleStatusCode(v->get_es().cancelTicketReservation(name, date, tic), ticketManagementMenu); } void command_buyTicket() { bool reserved; inputBox("Is ticket reserved? [0/1]: ", &reserved); char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); Ticket tic; inputBox("Enter row and seat: ", &tic); if (reserved) { char pass[PASSWORD_LEN]; inputLineBox("Enter reservation password: ", pass, PASSWORD_LEN); handleStatusCode(v->get_es().buyTicket(name, date, tic, pass), ticketManagementMenu); } else handleStatusCode(v->get_es().buyTicket(name, date, tic), ticketManagementMenu); } void submenu_ticketManagement() { ticketManagementMenu.navigate(); } /* Event Management */ void command_createEvent() { unsigned hallIndex; inputBox("Enter hall index: ", &hallIndex); if (!v->hallExists(hallIndex)) { eventManagementMenu.registerError("Invalid hall index!"); return; } char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); handleStatusCode(v->get_es().createEvent(&v->get_halls()[hallIndex], name, date), eventManagementMenu); } void command_cancelEvent() { char name[MAX_LINE_WIDTH]; inputLineBox("Enter event name: ", name, MAX_LINE_WIDTH); Date date; inputBox("Enter event date: ", &date); handleStatusCode(v->get_es().cancelEvent(name, date), eventManagementMenu); } void command_mostWatched() { } void command_belowWatchers() { } void submenu_eventManagement() { eventManagementMenu.navigate(); } /* Report Management */ void command_reservationsList() { } void command_boughtTickets() { } void submenu_reportManagement() { reportsMenu.navigate(); } /* Main */ void init() { mainMenu.addCommand(Command("Ticket Management", submenu_ticketManagement)); mainMenu.addCommand(Command("Event Management", submenu_eventManagement)); mainMenu.addCommand(Command("Report Management", submenu_reportManagement)); ticketManagementMenu.addCommand(Command("Count of Free Seats", command_freeSeats)); ticketManagementMenu.addCommand(Command("Reserve Ticket", command_reserveTicket)); ticketManagementMenu.addCommand(Command("Cancel Ticket Reservation", command_cancelReservation)); ticketManagementMenu.addCommand(Command("Buy Ticket", command_buyTicket)); eventManagementMenu.addCommand(Command("Create Event", command_createEvent)); eventManagementMenu.addCommand(Command("Cancel Event", command_cancelEvent)); eventManagementMenu.addCommand(Command("Query - Most Watched", command_mostWatched)); eventManagementMenu.addCommand(Command("Query - Below 10% watchers", command_belowWatchers)); reportsMenu.addCommand(Command("Reservations List", command_reservationsList)); reportsMenu.addCommand(Command("Bought Tickets", command_boughtTickets)); } void runUI(Venue& venue) { v = &venue; init(); mainMenu.navigate(); }