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}"; }
}
}
}
}