using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Modularity; using PolyTraderSharp; using PolyTraderSharp.Services; namespace PolyTrader.App.Avalonia.Shell { /// /// Registriert die Seiten, die der Core selbst beisteuert (Start, Dashboard, Einstellungen, /// Terminal, Jobs). Gegenstück zur entsprechenden Registrierung im WinForms-Program.cs – /// die View-IDs sind bewusst identisch, damit Symbole und Reihenfolge unverändert greifen. /// public static class CoreViews { /// Quelle/Ziel der Modul-Aktivierung – dieselbe Datei wie im Host. private const string ServerSettingsPath = "server_settings.xml"; public static void Register(IModuleUiHost host, IServiceProvider services) { // Die Startseite ist seit der Einfenster-Shell eine View wie jede andere: sie steht in // der Seitenleiste, wird über OpenView aufgerufen und beim Start als erste angezeigt. // Sie heißt „Dashboard", weil sie genau das ist: Kennzahlen, Konten und Live-Überblick. host.RegisterView(new ModuleView { Id = AvaloniaUiHost.StartViewId, Title = "Dashboard", Group = "Core", Order = 0, CreateView = () => new Views.LauncherWindow(host, services) }); host.RegisterView(new ModuleView { Id = "core.dashboard", // Umbenannt: „Dashboard" heißt jetzt die Startseite; diese Auswertungsansicht // (KPIs, Diagramme, Tradehistorie) läuft unter „Analytics". Die View-ID bleibt // bewusst unverändert – daran hängen Symbole, Einstellungen und die Gruppierung. Title = "Analytics", Group = "Core", Order = 10, CreateView = () => new Views.DashboardWindow( host, services.GetRequiredService(), services.GetRequiredService(), BuildModuleInfos(services), ServerSettingsPath) }); host.RegisterView(new ModuleView { Id = "core.settings", Title = "Server Settings", Group = "Core", Order = 20, CreateView = () => new Views.SettingsWindow( host, services.GetRequiredService(), services.GetRequiredService(), services.GetRequiredService(), services.GetService(), services.GetService(), services.GetService(), services.GetService()) }); host.RegisterView(new ModuleView { Id = "core.jobs", Title = "Server Jobs", Group = "Core", Order = 30, CreateView = () => new Views.JobsWindow(host, services.GetRequiredService()) }); host.RegisterView(new ModuleView { Id = "core.terminal", Title = "Terminal / Logs", Group = "Core", Order = 40, CreateView = () => new Views.TerminalWindow(host, services.GetRequiredService()) }); } /// /// Baut die Aktivierungs-Übersicht für den Modul-Tab: alle bekannten Module, ob sie in dieser /// Sitzung laufen, und ein etwaiger Grund gegen die Aktivierung (z.B. fehlender API-Key). /// private static IReadOnlyList BuildModuleInfos(IServiceProvider services) { var running = services.GetServices().ToList(); var runningNames = running.Select(m => m.Name).ToHashSet(StringComparer.OrdinalIgnoreCase); var config = services.GetRequiredService(); // Auch die NICHT geladenen Module auflisten – sonst liessen sie sich nie wieder aktivieren. var all = new IPolyTraderModule[] { new PolyTrader.Modules.CopyTrading.CopyTradingModule(), new PolyTrader.Modules.ResolutionFarming.ResolutionFarmingModule(), new PolyTrader.Modules.Supervisor.SupervisorModule(), new PolyTrader.Modules.Accounting.AccountingModule() }; return all.Select(m => new ModuleActivationInfo( m.Name, runningNames.Contains(m.Name), SafeBlocker(m, config))) .ToList(); static string? SafeBlocker(IPolyTraderModule m, IConfiguration config) { try { return m.GetActivationBlocker(config); } catch (Exception ex) { return $"Prüfung fehlgeschlagen: {ex.Message}"; } } } } }