using System;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Microsoft.Extensions.DependencyInjection;
using PolyTrader.App.Avalonia.Shell;
using PolyTrader.App.Avalonia.Views;

namespace PolyTrader.App.Avalonia
{
    /// <summary>
    /// Avalonia-Anwendungsobjekt. Hält die Verbindung zwischen dem bereits laufenden Generic Host
    /// (Trading-Services, Module, Persistenz) und der Oberfläche: beim Start wird der Launcher
    /// erzeugt und die Views von Core und Modulen werden bei der Shell registriert.
    /// </summary>
    public partial class App : global::Avalonia.Application
    {
        /// <summary>
        /// Wird von <see cref="Program"/> vor <c>StartWithClassicDesktopLifetime</c> gesetzt.
        /// Bewusst statisch: Avalonia erzeugt die Application-Instanz selbst, ein Konstruktor-
        /// Parameter ist daher nicht möglich.
        /// </summary>
        public static IServiceProvider? Services { get; set; }

        public override void Initialize() => AvaloniaXamlLoader.Load(this);

        public override void OnFrameworkInitializationCompleted()
        {
            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && Services != null)
            {
                // Farbschema aus den Server-Settings übernehmen, BEVOR das erste Fenster entsteht –
                // sonst blitzt kurz das helle Standardschema auf.
                var settings = Services.GetRequiredService<PolyTraderSharp.Models.ServerSettings>();
                Shell.ThemeManager.Initialize(settings, "server_settings.xml",
                    Services.GetRequiredService<PolyTraderSharp.Services.TerminalLogger>());

                var uiHost = Services.GetRequiredService<AvaloniaUiHost>();

                CoreViews.Register(uiHost, Services);
                foreach (var module in Services.GetServices<Core.Modularity.IPolyTraderModule>())
                    module.RegisterUi(uiHost, Services);
                ModuleViews.Register(uiHost, Services);
                ViewIcons.AssignDefaults(uiHost);

                // Einfenster-Shell: ein Fenster, die Views hängen als Seiten darin.
                var shell = new ShellWindow(uiHost, Services);
                uiHost.SetShell(shell);
                desktop.MainWindow = shell;

                // Schliessen der Shell laeuft ueber die Sicherheitsabfrage (wie bisher das X).
                desktop.ShutdownMode = global::Avalonia.Controls.ShutdownMode.OnMainWindowClose;

                // Erste Seite: die Startseite (frühere LauncherForm).
                uiHost.ActivateMain();
            }

            base.OnFrameworkInitializationCompleted();
        }
    }
}
