using System;
using Avalonia;
using Avalonia.Controls;
using Project_Periodensystem.Model;
using Project_Periodensystem.Persistence;
using Project_Periodensystem.Controller;
namespace Project_Periodensystem.View
{
///
/// Implementiert die Navigation zwischen verschiedenen Seiten der Avalonia-Anwendung.
/// Trennt die Navigation-Logik (WAS) vom UI-Framework (WIE) durch Interface-Implementation.
/// Löst zirkuläre Abhängigkeiten durch zweistufige Initialisierung.
///
public class NavigationService : INavigationService
{
// ===== PRIVATE FELDER =====
///
/// Referenz zum Hauptfenster für Navigation zwischen Seiten
///
private readonly MainWindow _mainWindow;
///
/// Data Controller für Datenzugriff (wird nach Konstruktion gesetzt)
///
private PeriodensystemController? _dataController;
// ===== KONSTRUKTOR UND INITIALISIERUNG =====
///
/// Initialisiert den NavigationService mit dem Hauptfenster
///
/// Das Hauptfenster der Avalonia-Anwendung
public NavigationService(MainWindow mainWindow)
{
_mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
Logger.Log("NavigationService initialisiert");
}
///
/// Setzt den Data Controller nach der Konstruktion (löst zirkuläre Abhängigkeit)
///
/// Der PeriodensystemController für Datenzugriff
public void SetDataController(PeriodensystemController dataController)
{
_dataController = dataController ?? throw new ArgumentNullException(nameof(dataController));
Logger.Log("DataController in NavigationService gesetzt");
}
///
/// Navigation zum Periodensystem - zeigt PeriodicTablePage im MainContent an
///
public void NavigateToPeriodicTable()
{
try
{
if (_dataController == null)
{
Logger.LogError("DataController nicht gesetzt");
return;
}
// PeriodicTablePage erstellen und Controller setzen
var periodicTablePage = new PeriodicTablePage();
periodicTablePage.SetController(_dataController);
// MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
mainContent.Content = periodicTablePage;
Logger.Log("NavigationService: Navigation zum Periodensystem");
}
else
{
Logger.LogError("MainContent Control nicht gefunden");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "NavigateToPeriodicTable");
}
}
///
/// Navigation zur About-Seite - zeigt Projektinformationen und Credits
///
public void NavigateToAbout()
{
try
{
if (_dataController == null)
{
Logger.LogError("DataController nicht gesetzt");
return;
}
// AboutPage erstellen und Controller setzen
var aboutPage = new AboutPage();
aboutPage.SetController(_dataController);
// MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
mainContent.Content = aboutPage;
Logger.Log("NavigationService: Navigation zu About");
}
else
{
Logger.LogError("MainContent Control nicht gefunden");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "NavigateToAbout");
}
}
///
/// Navigation zur Landing Page - Startseite der Anwendung
///
public void NavigateToLanding()
{
try
{
if (_dataController == null)
{
Logger.LogError("DataController nicht gesetzt");
return;
}
// LandingPage erstellen und Controller setzen
var landingPage = new LandingPage();
landingPage.SetController(_dataController);
// MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
mainContent.Content = landingPage;
Logger.Log("NavigationService: Navigation zur Landing Page");
}
else
{
Logger.LogError("MainContent Control nicht gefunden");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "NavigateToLanding");
}
}
///
/// Wechselt zwischen Dark- und Light-Theme der Avalonia-Anwendung
///
public void ToggleTheme()
{
try
{
var app = Application.Current;
if (app != null)
{
// Aktuelles Theme ermitteln und umschalten
var currentTheme = app.ActualThemeVariant;
var newTheme = currentTheme == Avalonia.Styling.ThemeVariant.Dark
? Avalonia.Styling.ThemeVariant.Light
: Avalonia.Styling.ThemeVariant.Dark;
// Neues Theme anwenden
app.RequestedThemeVariant = newTheme;
// Theme-Einstellung persistent speichern
var settings = new AppSettings
{
LastTheme = newTheme.ToString() ?? "Dark",
LastUsed = DateTime.Now,
PreferredLanguage = "German"
};
DataManager.SaveSettings(settings);
Logger.Log($"NavigationService: Theme gewechselt zu {newTheme}");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "ToggleTheme");
}
}
///
/// Zeigt eine Export-Bestätigung an (aktuell nur Logging)
///
public void ShowExportConfirmation()
{
try
{
Logger.Log("NavigationService: Export-Bestätigung angezeigt");
// TODO: Hier könnte ein Dialog oder Notification angezeigt werden
}
catch (Exception ex)
{
Logger.LogException(ex, "ShowExportConfirmation");
}
}
}
}