Files
CineBook/Views/ScreeningsView.xaml.cs

159 lines
5.8 KiB
C#

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); }
}
}
}