using CineBook.Data; using CineBook.Helpers; using CineBook.Models; using System.Windows; using System.Windows.Controls; namespace CineBook.Views; public partial class ScreeningsView : UserControl { private readonly Repository _repo; private Screening? _selected; public ScreeningsView(Repository repo) { InitializeComponent(); _repo = repo; if (!Session.IsAdmin) { BtnAdd.Visibility = Visibility.Collapsed; BtnEdit.Visibility = Visibility.Collapsed; BtnDelete.Visibility = Visibility.Collapsed; } LoadMovieFilter(); LoadScreenings(); } private void LoadMovieFilter() { try { var movies = _repo.GetMovies(onlyActive: true); MovieFilter.Items.Clear(); MovieFilter.Items.Add(new ComboBoxItem { Content = "— Alle Filme —", Tag = 0, Foreground = System.Windows.Media.Brushes.Gray, FontFamily = new System.Windows.Media.FontFamily("Courier New") }); foreach (var m in movies) MovieFilter.Items.Add(new ComboBoxItem { Content = m.Title, Tag = m.MovieID, Foreground = System.Windows.Media.Brushes.Gold, FontFamily = new System.Windows.Media.FontFamily("Courier New") }); MovieFilter.SelectedIndex = 0; } catch { } } private void LoadScreenings() { try { var list = _repo.GetScreenings(); ScreeningsGrid.ItemsSource = list; StatusText.Text = $"● {list.Count} Vorführungen geladen."; } catch (System.Exception ex) { StatusText.Text = "⚠ Fehler: " + ex.Message; } } private void FilterChanged(object sender, SelectionChangedEventArgs e) { if (MovieFilter.SelectedItem is ComboBoxItem item && item.Tag is int id && id > 0) { try { ScreeningsGrid.ItemsSource = _repo.GetScreeningsByMovie(id); } catch (System.Exception ex) { StatusText.Text = "⚠ " + ex.Message; } } else LoadScreenings(); } private void GridSelectionChanged(object sender, SelectionChangedEventArgs e) { _selected = ScreeningsGrid.SelectedItem as Screening; BtnDelete.IsEnabled = _selected != null && Session.IsAdmin; BtnEdit.IsEnabled = _selected != null && Session.IsAdmin; BtnBookSeat.IsEnabled = _selected != null && _selected.AvailableSeats > 0; } private void LoadAllClick(object sender, RoutedEventArgs e) { MovieFilter.SelectedIndex = 0; LoadScreenings(); } private void AddClick(object sender, RoutedEventArgs e) { var movies = _repo.GetMovies(onlyActive: true); var dlg = new ScreeningEditDialog(movies); if (dlg.ShowDialog() == true && dlg.Result != null) { try { _repo.CreateScreening(dlg.Result); LoadScreenings(); LoadMovieFilter(); } catch (System.Exception ex) { MessageBox.Show("DB-Fehler: " + ex.Message); } } } private void EditClick(object sender, RoutedEventArgs e) { if (_selected == null) return; var movies = _repo.GetMovies(onlyActive: true); var dlg = new ScreeningEditDialog(movies, _selected); if (dlg.ShowDialog() == true && dlg.Result != null) { try { if (_repo.UpdateScreening(dlg.Result)) LoadScreenings(); else MessageBox.Show("Fehler beim Speichern.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } catch (System.Exception ex) { MessageBox.Show("DB-Fehler: " + ex.Message); } } } private void DeleteClick(object sender, RoutedEventArgs e) { if (_selected == null) return; var r = MessageBox.Show($"Vorführung löschen?", "Bestätigung", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (r == MessageBoxResult.Yes) { try { _repo.DeleteScreening(_selected.ScreeningID); LoadScreenings(); } catch (System.Exception ex) { MessageBox.Show("DB-Fehler: " + ex.Message); } } } private void BookSeatClick(object sender, RoutedEventArgs e) { if (_selected == null) return; var seats = _repo.GetSeatsByScreening(_selected.ScreeningID); if (seats.Count == 0) { if (Session.IsAdmin) { var r = MessageBox.Show( "Für diese Vorführung existieren noch keine Sitzplätze.\nSoll jetzt automatisch ein Sitzplan erstellt werden?", "Sitzplan fehlt", MessageBoxButton.YesNo, MessageBoxImage.Question); if (r == MessageBoxResult.Yes) { if (_repo.EnsureSeatsForScreening(_selected.ScreeningID, _selected.TotalSeats)) seats = _repo.GetSeatsByScreening(_selected.ScreeningID); } } if (seats.Count == 0) { MessageBox.Show("Keine Sitzplatzdaten verfügbar.", "Hinweis"); return; } } var dlg = new SeatSelectionDialog(_selected, seats, Session.CurrentUser!); if (dlg.ShowDialog() == true) { try { _repo.CreateBooking(Session.CurrentUser!.UserID, dlg.SelectedScreeningId, dlg.SelectedSeatId, dlg.TotalPrice); LoadScreenings(); MessageBox.Show($"✓ Buchung erfolgreich!\nSitz: {dlg.SeatDisplay}\nPreis: {dlg.TotalPrice:F2} €", "Buchung bestätigt", MessageBoxButton.OK, MessageBoxImage.Information); } catch (System.Exception ex) { MessageBox.Show("DB-Fehler: " + ex.Message); } } } }