// Aplikacja powinna umożliwiać: // ● Dodać seans filmowy (tytuł, data, godzina, liczba miejsc), // ● Wyświetlić dostępne miejsca, // ● Zarezerwować miejsce, // ● Zapisać wszystkie dane (np. w pliku tekstowym lub pliku JSON). // Technicznie powinna zawierać: // ● Klasy odzwierciedlające logikę biznesową (np. Seans, Miejsce, Rezerwacja, itd.). // ● Podstawy projektowania obiektowego (właściwości klas, proste metody). // ● Czytanie i zapisywanie danych do pliku. public static class Program { private static ShowCatalog showCatalog = new(); public static void Main(string[] args) { SeedShows(); // only for tests while (true) { Console.WriteLine("=== Cinema Reservation System ==="); Console.WriteLine("1. Display all shows"); Console.WriteLine("2. Add a new show"); Console.WriteLine("3. Reserve seat"); Console.WriteLine("4. Exit"); Console.Write("Choose an option: "); string? choice = Console.ReadLine(); System.Console.WriteLine(); if (string.IsNullOrWhiteSpace(choice)) { continue; } switch (choice) { case "1": DisplayAllShows(); System.Console.WriteLine(); break; case "2": AddShow(); System.Console.WriteLine(); break; case "3": ReserveSeat(); break; case "4": System.Console.WriteLine("Zamykam aplikację..."); return; default: System.Console.WriteLine("Nieznana operacja. Spróbuj ponownie"); System.Console.WriteLine(); break; } } } private static void SeedShows() { var movie1 = new Show("TopGun", new DateOnly(2025, 11, 10), new TimeOnly(18, 45)); var movie2 = new Show("Rocky", new DateOnly(2025, 11, 10), new TimeOnly(16, 30)); showCatalog.AddShow(movie1); showCatalog.AddShow(movie2); } private static void DisplayAllShows() { int counter = 0; foreach (var show in showCatalog.Shows) { counter++; System.Console.WriteLine($"{counter}. {show.Title} - {show.ShowDate.ToShortDateString()} " + $"{show.ShowHour.ToShortTimeString()}"); } } private static void AddShow() { System.Console.Write("Dodaj tytuł: "); string? title = Console.ReadLine(); System.Console.Write("Podaj datę seansu (yyyy-MM-dd): "); string? dateInput = Console.ReadLine(); System.Console.Write("Podaj godzinę seansu (hh:mm): "); string? hourInput = Console.ReadLine(); if (string.IsNullOrWhiteSpace(title)) { System.Console.WriteLine("Nieprawidlowa nazwa filmu"); return; } if (!DateOnly.TryParse(dateInput, out DateOnly date)) { System.Console.WriteLine("Nieprawidłowy format daty"); return; } if (!TimeOnly.TryParse(hourInput, out TimeOnly time)) { System.Console.WriteLine("Nieprawidłowy format godziny"); return; } System.Console.WriteLine("Liczba siedzeń na seansie: "); if (!int.TryParse(Console.ReadLine(), out int seats)) { seats = 0; } if (seats > 0) { showCatalog.AddShow( new Show(title, date, time, seats) ); } else { showCatalog.AddShow( new Show(title, date, time) ); } } private static void ReserveSeat() { DisplayAllShows(); System.Console.Write("Podaj numer filmu: "); if (!int.TryParse(Console.ReadLine(), out int index)) { System.Console.WriteLine("Nieprawidlowy format numeru filmu"); return; } if (index < 0 || index > showCatalog.Shows.Count) { System.Console.WriteLine("Index poza zakresem: "); return; } var selectedShow = showCatalog.Shows[index]; var freeSeats = selectedShow.Seats.Where(s => !s.IsReserved).ToList(); if (freeSeats.Count == 0) { System.Console.WriteLine("Nie ma już wolnych miejsc"); return; } else { foreach (var seat in freeSeats) { System.Console.Write($"{seat.SeatNumber}, "); } System.Console.WriteLine(); } if (!int.TryParse(Console.ReadLine(), out int choiceSeat)) { System.Console.WriteLine("Nieprawidłowy numer siedzenia"); return; } var seatToReseve = freeSeats.Where(s => s.SeatNumber == choiceSeat).FirstOrDefault(); if (seatToReseve == null) { System.Console.WriteLine("Siedzenie jest już zajęte lub nie ma takiego siedzenia"); } else { seatToReseve.Reseve(); System.Console.WriteLine("Zarezerwowano siedzenie"); } } }