using System;
using System.Collections.Generic;
using System.Linq;
using Project_Periodensystem.Model;
namespace Project_Periodensystem.Controller
{
///
/// ElementStatistics - Spezialisierte Klasse für statistische Berechnungen und Datenanalyse
///
/// Diese Klasse wurde aus dem Haupt-Controller ausgelagert, um das Single Responsibility
/// Principle zu befolgen. Sie konzentriert sich ausschließlich auf:
///
/// - Mathematische Berechnungen (Durchschnitte, Extreme)
/// - Datengruppierung und -analyse (Serien, Kategorien)
/// - Informationsextraktion (Tuple-basierte Abfragen)
/// - Performance-optimierte LINQ-Operationen
///
/// Vorteile der Auslagerung:
/// - Bessere Testbarkeit einzelner Berechnungen
/// - Wiederverwendbarkeit der Statistik-Funktionen
/// - Klare Trennung von UI-Logik und Datenverarbeitung
/// - Einfache Erweiterung um neue Statistiken
///
public class ElementStatistics
{
///
/// Private, schreibgeschützte Liste aller Elemente für statistische Berechnungen.
/// Wird im Konstruktor gesetzt und bleibt danach unveränderlich (readonly).
/// Garantiert Datenintegrität während der gesamten Lebensdauer des Objekts.
///
private readonly List _elements;
///
/// Konstruktor der ElementStatistics-Klasse.
/// Initialisiert die Statistik-Engine mit einer Element-Sammlung.
///
/// Design-Prinzipien:
/// - Dependency Injection: Element-Liste wird von außen bereitgestellt
/// - Defensive Programmierung: Null-Safety durch Fallback
/// - Unveränderlichkeit: readonly field für Datensicherheit
///
/// Liste der Elemente für statistische Auswertungen (kann null sein)
public ElementStatistics(List elements)
{
// Null-Safety: Falls null übergeben wird, erstelle eine leere Liste
// Verhindert NullReferenceExceptions in allen nachfolgenden Methoden
_elements = elements ?? new List();
}
public double[] GetAtomicWeights()
{
double[] weights = new double[_elements.Count];
for (int i = 0; i < _elements.Count; i++)
{
weights[i] = _elements[i].AtomicWeight;
}
return weights;
}
public double GetAverageAtomicWeight()
{
if (!_elements.Any()) return 0.0;
double[] weights = GetAtomicWeights();
double sum = 0;
for (int i = 0; i < weights.Length; i++)
{
sum += weights[i];
}
return sum / weights.Length;
}
public List GetAllSeries()
{
return _elements.Select(e => e.Series)
.Distinct()
.Where(s => !string.IsNullOrWhiteSpace(s))
.OrderBy(s => s)
.ToList();
}
public (int totalElements, int uniqueSeries, double avgWeight) GetStatistics()
{
var seriesCount = GetAllSeries().Count;
var avgWeight = GetAverageAtomicWeight();
return (_elements.Count, seriesCount, avgWeight);
}
public (Element? lightest, Element? heaviest) GetWeightExtremes()
{
if (!_elements.Any()) return (null, null);
var lightest = _elements.OrderBy(e => e.AtomicWeight).First();
var heaviest = _elements.OrderByDescending(e => e.AtomicWeight).First();
return (lightest, heaviest);
}
public (string symbol, string name, double weight) GetElementInfo(int atomicNumber)
{
var element = _elements.FirstOrDefault(e => e.AtomicNumber == atomicNumber);
return element != null
? (element.Symbol, element.ElementName, element.AtomicWeight)
: ("?", "Unknown", 0.0);
}
public (int row, int column) GetElementPosition(int atomicNumber)
{
var element = _elements.FirstOrDefault(e => e.AtomicNumber == atomicNumber);
return element != null ? (element.Row, element.Column) : (-1, -1);
}
}
}