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
{
    /// <summary>
    /// 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.
    /// </summary>
    public static class CoreViews
    {
        /// <summary>Quelle/Ziel der Modul-Aktivierung – dieselbe Datei wie im Host.</summary>
        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<PolyTrader.Core.Persistence.ITradeLogRepository>(),
                    services.GetRequiredService<TradingState>(),
                    BuildModuleInfos(services),
                    ServerSettingsPath)
            });

            host.RegisterView(new ModuleView
            {
                Id = "core.settings",
                Title = "Server Settings",
                Group = "Core",
                Order = 20,
                CreateView = () => new Views.SettingsWindow(
                    host,
                    services.GetRequiredService<PolyTrader.Core.Persistence.IAccountRepository>(),
                    services.GetRequiredService<TradingState>(),
                    services.GetRequiredService<TerminalLogger>(),
                    services.GetService<WatchdogHeartbeatService>(),
                    services.GetService<MullvadVpnService>(),
                    services.GetService<PolyTrader.Core.Configuration.DeploymentcenterOptions>())
            });

            host.RegisterView(new ModuleView
            {
                Id = "core.jobs",
                Title = "Server Jobs",
                Group = "Core",
                Order = 30,
                CreateView = () => new Views.JobsWindow(host, services.GetRequiredService<JobManager>())
            });

            host.RegisterView(new ModuleView
            {
                Id = "core.terminal",
                Title = "Terminal / Logs",
                Group = "Core",
                Order = 40,
                CreateView = () => new Views.TerminalWindow(host, services.GetRequiredService<TerminalLogger>())
            });
        }

        /// <summary>
        /// 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).
        /// </summary>
        private static IReadOnlyList<ModuleActivationInfo> BuildModuleInfos(IServiceProvider services)
        {
            var running = services.GetServices<IPolyTraderModule>().ToList();
            var runningNames = running.Select(m => m.Name).ToHashSet(StringComparer.OrdinalIgnoreCase);
            var config = services.GetRequiredService<IConfiguration>();

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