using System; using System.Collections.Generic; using System.Linq; using Project_Periodensystem.Model; using Project_Periodensystem.Persistence; namespace Project_Periodensystem.Controller { /// /// Controller für das Periodensystem - verwaltet die Geschäftslogik /// und trennt View von Model gemäß MVC-Pattern /// public class PeriodensystemController { // Nullable Field um Warning zu vermeiden private List _elements = new List(); /// /// Konstruktor - initialisiert den Controller /// public PeriodensystemController() { LoadElements(); } /// /// Lädt alle Elemente über den Persistence-Layer /// private void LoadElements() { try { // Verwende die korrekte statische Methode aus PeriodicTableData _elements = PeriodicTableData.Elements.ToList(); Logger.Log($"Controller: {_elements.Count} Elemente erfolgreich geladen"); } catch (Exception ex) { Logger.Log($"EXCEPTION in LoadElements: {ex.Message}"); _elements = new List(); } } /// /// Gibt alle verfügbaren Elemente zurück /// /// Liste aller Elemente public List GetAllElements() { return _elements; } /// /// Sucht ein Element nach Atomnummer /// /// Atomnummer des gesuchten Elements /// Element oder null wenn nicht gefunden public Element? GetElementByAtomicNumber(int atomicNumber) { if (atomicNumber <= 0) { Logger.Log($"Ungültige Atomnummer: {atomicNumber}"); return null; } return _elements.FirstOrDefault(e => e.AtomicNumber == atomicNumber); } /// /// Sucht ein Element nach Symbol /// /// Symbol des gesuchten Elements /// Element oder null wenn nicht gefunden public Element? GetElementBySymbol(string symbol) { if (string.IsNullOrWhiteSpace(symbol)) { Logger.Log("Leeres Symbol übergeben"); return null; } return _elements.FirstOrDefault(e => string.Equals(e.Symbol, symbol, StringComparison.OrdinalIgnoreCase)); } /// /// Filtert Elemente nach Serie /// /// Gewünschte Elementserie /// Liste der Elemente der angegebenen Serie public List GetElementsBySeries(string series) { if (string.IsNullOrWhiteSpace(series)) { return new List(); } return _elements.Where(e => string.Equals(e.Series, series, StringComparison.OrdinalIgnoreCase)) .ToList(); } /// /// Validiert Grid-Position eines Elements /// /// Zu validierendes Element /// True wenn Position gültig ist public bool ValidateElementPosition(Element element) { if (element == null) { Logger.Log("Null-Element kann nicht validiert werden"); return false; } // Periodensystem hat 7 Perioden (0-6) und 18 Gruppen (0-17) // Plus Lanthanoid/Actinoid-Reihen bei Zeile 8 und 9 bool validRow = element.Row >= 0 && element.Row <= 9; bool validColumn = element.Column >= 0 && element.Column <= 17; if (!validRow || !validColumn) { Logger.Log($"Ungültige Position für {element.Symbol}: ({element.Row},{element.Column})"); return false; } return true; } /// /// Gibt alle verfügbaren Element-Serien zurück /// /// Liste aller Serien public List GetAllSeries() { return _elements.Select(e => e.Series) .Distinct() .Where(s => !string.IsNullOrWhiteSpace(s)) .OrderBy(s => s) .ToList(); } /// /// Überprüft ob alle Elemente korrekt geladen wurden /// /// True wenn Daten vollständig sind public bool ValidateData() { if (_elements.Count == 0) { Logger.Log("Keine Elemente geladen"); return false; } // Überprüfe auf Duplikate bei Atomnummern var duplicateNumbers = _elements.GroupBy(e => e.AtomicNumber) .Where(g => g.Count() > 1) .Select(g => g.Key); if (duplicateNumbers.Any()) { Logger.Log($"Doppelte Atomnummern gefunden: {string.Join(", ", duplicateNumbers)}"); return false; } // Überprüfe auf leere Symbole var emptySymbols = _elements.Where(e => string.IsNullOrWhiteSpace(e.Symbol)); if (emptySymbols.Any()) { Logger.Log("Elemente mit leeren Symbolen gefunden"); return false; } Logger.Log($"Datenvalidierung erfolgreich - {_elements.Count} Elemente validiert"); return true; } /// /// Lädt Daten neu (für Refresh-Funktionalität) /// public void RefreshData() { Logger.Log("Daten werden neu geladen..."); LoadElements(); } /// /// Gibt die Anzahl der geladenen Elemente zurück /// /// Anzahl der Elemente public int GetElementCount() { return _elements.Count; } } }