using System;
using System.Globalization;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using Project_Periodensystem.Controller;
using Project_Periodensystem.Model;
using Project_Periodensystem.Persistence;
using Project_Periodensystem.View.Converters;
namespace Project_Periodensystem.View
{
///
/// Code-Behind für das Periodensystem - nur UI-Logik, keine Geschäftslogik
///
public partial class PeriodicTablePage : UserControl
{
private readonly Grid? periodicGrid;
private PeriodensystemController? _controller;
///
/// Konstruktor - initialisiert UI (Controller wird per SetController gesetzt)
///
public PeriodicTablePage()
{
InitializeComponent();
// Grid-Referenz für Element-Buttons
periodicGrid = this.FindControl("PeriodicGrid");
}
///
/// Controller setzen (Dependency Injection für MVC)
///
public void SetController(PeriodensystemController controller)
{
_controller = controller ?? throw new ArgumentNullException(nameof(controller));
Logger.Log("PeriodicTablePage: Controller gesetzt (MVC-Pattern)");
// Elemente laden und anzeigen
LoadAndDisplayElements();
}
///
/// Lädt Elemente über Controller und zeigt sie an
///
private void LoadAndDisplayElements()
{
try
{
if (_controller == null)
{
Logger.LogError("Controller nicht gesetzt - kann Elemente nicht laden");
return;
}
// Daten über Controller laden (nicht direkt!)
var elements = _controller.GetAllElements();
if (!elements.Any())
{
Logger.Log("Keine Elemente vom Controller erhalten");
return;
}
// Datenvalidierung über Controller
if (!_controller.ValidateData())
{
Logger.Log("Datenvalidierung fehlgeschlagen");
return;
}
Logger.Log($"Lade {elements.Count} Elemente in das Grid");
// UI-Update für jedes Element
int successCount = 0;
foreach (var element in elements)
{
if (_controller.ValidateElementPosition(element))
{
CreateElementButton(element);
successCount++;
}
else
{
Logger.Log($"Element {element?.Symbol ?? "NULL"} übersprungen - ungültige Position");
}
}
Logger.Log($"{successCount} von {elements.Count} Elementen erfolgreich geladen");
}
catch (Exception ex)
{
Logger.Log($"EXCEPTION in LoadAndDisplayElements: {ex.Message}");
}
}
///
/// Erstellt UI-Button für ein Element (nur View-Logik)
///
/// Element für das der Button erstellt wird
private void CreateElementButton(Element element)
{
if (element == null)
{
Logger.Log("Null-Element kann nicht angezeigt werden");
return;
}
// UI-Komponenten erstellen
var button = new Button { Classes = { "ElementTile" } };
var panel = new StackPanel();
// Hintergrundfarbe über Converter setzen
var backgroundColor = new SeriesToColorConverter()
.Convert(element.Series, typeof(Brush), null, CultureInfo.InvariantCulture) as Brush;
if (backgroundColor != null)
{
button.Background = backgroundColor;
}
// Text-Elemente erstellen
var symbolText = new TextBlock
{
Text = element.Symbol,
Classes = { "Symbol" },
Foreground = new SolidColorBrush(Colors.White),
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center
};
var numberText = new TextBlock
{
Text = element.AtomicNumber.ToString(),
Classes = { "Number" },
Foreground = new SolidColorBrush(Colors.White),
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center
};
// Layout zusammenbauen
panel.Children.Add(numberText); // Number on top
panel.Children.Add(symbolText); // Symbol below
button.Content = panel;
// Grid-Position setzen (0-basiert)
int gridRow = element.Row;
int gridColumn = element.Column;
Logger.Log($"Element {element.Symbol}: Grid({gridRow},{gridColumn})");
Grid.SetRow(button, gridRow);
Grid.SetColumn(button, gridColumn);
// Button zum Grid hinzufügen
if (periodicGrid != null)
{
periodicGrid.Children.Add(button);
}
else
{
Logger.Log("PeriodicGrid ist null - Button kann nicht hinzugefügt werden");
}
}
///
/// Event-Handler für Theme-Button - SAUBERES MVC
///
private void ThemeButton_Click(object? sender, RoutedEventArgs e)
{
try
{
if (_controller != null)
{
// Controller übernimmt Theme-Logik
_controller.HandleToggleTheme();
}
else
{
Logger.LogError("Controller nicht gesetzt - kann Theme nicht wechseln");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "ThemeButton_Click");
}
}
///
/// Event-Handler für About-Button - SAUBERES MVC
///
private void AboutButton_Click(object? sender, RoutedEventArgs e)
{
try
{
if (_controller != null)
{
// Controller übernimmt Navigation
_controller.HandleNavigateToAbout();
}
else
{
Logger.LogError("Controller nicht gesetzt - kann nicht navigieren");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "AboutButton_Click");
}
}
///
/// Event-Handler für Zurück-Button - SAUBERES MVC
///
private void BackButton_Click(object? sender, RoutedEventArgs e)
{
try
{
if (_controller != null)
{
// Controller übernimmt Navigation
_controller.HandleNavigateToLanding();
}
else
{
Logger.LogError("Controller nicht gesetzt - kann nicht navigieren");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "BackButton_Click");
}
}
///
/// Export-Button für Element-Daten - SAUBERES MVC
///
private void ExportButton_Click(object? sender, RoutedEventArgs e)
{
try
{
if (_controller != null)
{
// Controller übernimmt Export-Logik
_controller.HandleExportData();
}
else
{
Logger.LogError("Controller nicht gesetzt - kann nicht exportieren");
}
}
catch (Exception ex)
{
Logger.LogException(ex, "ExportButton_Click");
}
}
}
}