using UtopiaCanteenSystem.ViewModels;
namespace UtopiaCanteenSystem.Services;
///
/// Holds the current view model and notifies when it changes for binding in MainWindow.
///
public class NavigationService : INavigationService
{
private object? _currentViewModel;
private DateTime? _dashboardSessionStartUtc;
private readonly AppSession _session;
public object? CurrentViewModel
{
get => _currentViewModel;
private set
{
if (_currentViewModel == value) return;
_currentViewModel = value;
CurrentViewModelChanged?.Invoke(this, EventArgs.Empty);
}
}
public event EventHandler? CurrentViewModelChanged;
private readonly Func _adminLoginVm;
private readonly Func _scannerVm;
private readonly Func _dashboardVm;
private readonly Func _adminSettingsAuthVm;
private readonly Func _settingsVm;
public NavigationService(
AppSession session,
Func adminLoginVm,
Func scannerVm,
Func dashboardVm,
Func adminSettingsAuthVm,
Func settingsVm)
{
_session = session;
_adminLoginVm = adminLoginVm;
_scannerVm = scannerVm;
_dashboardVm = dashboardVm;
_adminSettingsAuthVm = adminSettingsAuthVm;
_settingsVm = settingsVm;
}
public void NavigateToAdminLogin()
{
CurrentViewModel = _adminLoginVm();
}
public void NavigateToScanner()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _scannerVm();
}
public void NavigateToDashboard()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _dashboardVm();
}
public void NavigateToSettings()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _settingsVm();
}
public void NavigateToAdminSettingsAuth()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _adminSettingsAuthVm();
}
public void StartDashboardSession()
{
_dashboardSessionStartUtc = DateTime.UtcNow;
}
public bool IsDashboardSessionExpired(TimeSpan timeout)
{
if (!_dashboardSessionStartUtc.HasValue)
return true;
return DateTime.UtcNow - _dashboardSessionStartUtc.Value >= timeout;
}
public TimeSpan GetDashboardSessionElapsed()
{
if (!_dashboardSessionStartUtc.HasValue)
return TimeSpan.MaxValue;
return DateTime.UtcNow - _dashboardSessionStartUtc.Value;
}
public void NavigateBackFromSettings(TimeSpan timeout)
{
if (IsDashboardSessionExpired(timeout))
NavigateToScanner();
else
NavigateToDashboard();
}
}