using System;
using System.Collections.Generic;

namespace PolyTrader.Core.Modularity
{
    /// <summary>
    /// Eine vom Core oder einem Modul beigesteuerte Ansicht. Die Shell zeigt je View höchstens eine
    /// Instanz und holt eine bereits erzeugte wieder nach vorn.
    ///
    /// <para><b>Bewusst toolkit-neutral:</b> <see cref="CreateView"/> liefert ein <see cref="object"/>,
    /// keinen konkreten Anzeigetyp. Dadurch bleibt der Core plattformunabhängig und trägt keine
    /// WinForms-Abhängigkeit mehr. Die jeweilige Shell kennt ihr Toolkit und castet: die frühere
    /// WinForms-Shell auf <c>System.Windows.Forms.Form</c>, die Avalonia-Shell auf
    /// <c>Avalonia.Controls.Control</c>.</para>
    ///
    /// <para><b>Anzeigeform:</b> Die Avalonia-Shell ist seit dem UI-Umbau eine <b>Einfenster-Shell</b> –
    /// eine View ist dort eine Seite (<c>UserControl</c>) im Inhaltsbereich des einzigen Fensters,
    /// kein eigenes Fenster mehr. Der Vertrag hier bleibt davon unberührt; nur die Begriffe „offen"
    /// und „Vordergrund" bedeuten jetzt „erzeugt" bzw. „angezeigt".</para>
    /// </summary>
    public sealed class ModuleView
    {
        /// <summary>Stabile ID für Einzelinstanz-Handling (nur eine Instanz je View).</summary>
        public string Id { get; init; } = Guid.NewGuid().ToString();

        /// <summary>Titel der Ansicht – in der Avalonia-Shell die Beschriftung in Seitenleiste und Kopfzeile.</summary>
        public string Title { get; init; } = "Fenster";

        /// <summary>Optionale Gruppierung (z.B. "Core", "CopyTrading").</summary>
        public string? Group { get; init; }

        /// <summary>Optionale Sortierreihenfolge.</summary>
        public int Order { get; init; } = 0;

        /// <summary>
        /// Logischer Schlüssel des Symbols für Menüs/Buttons (z.B. "dashboard", "money"). Die Shell
        /// löst ihn gegen ihre eigenen Ressourcen auf – der Core kennt keine Bilddaten mehr (früher
        /// <c>System.Drawing.Image</c>, das seit .NET 7 Windows-only ist und auf Linux wirft).
        /// Settable, damit die App den von Modulen registrierten Views zentral ein Symbol zuweisen kann
        /// (Module referenzieren die App-Ressourcen nicht).
        /// </summary>
        public string? IconKey { get; set; }

        /// <summary>
        /// Erzeugt die anzuzeigende Ansicht. Rückgabetyp ist
        /// <see cref="object"/> – siehe Klassen-Doku zur Toolkit-Neutralität.
        /// </summary>
        public Func<object> CreateView { get; init; } = () => new object();
    }

    /// <summary>
    /// Wird der Shell beim Start übergeben; Core und Module registrieren hier ihre Ansichten.
    /// Die Shell zeigt eine Ansicht auf Anforderung an und verwaltet ihren Zustand. Über die
    /// Navigations-Mitglieder kann JEDE Ansicht (auch Modul-Ansichten, die nur den Core kennen)
    /// zu einer anderen wechseln oder das Herunterfahren einleiten.
    /// </summary>
    public interface IModuleUiHost
    {
        void RegisterView(ModuleView view);

        /// <summary>Alle registrierten Ansichten (Core + Module).</summary>
        IReadOnlyList<ModuleView> Views { get; }

        /// <summary>Wurde diese View bereits erzeugt (in der Mehrfenster-Fassung: „Fenster ist offen")?</summary>
        bool IsOpen(string viewId);

        /// <summary>Zeigt die View an bzw. holt eine bereits erzeugte wieder nach vorn.</summary>
        void OpenView(string viewId);

        /// <summary>Zurück zur Startansicht.</summary>
        void ActivateMain();

        /// <summary>
        /// Leitet das sichere Herunterfahren ein (Bestätigungsdialog mit Timer). Aus jeder Ansicht
        /// aufrufbar – auch aus Modul-Ansichten, die die App nicht kennen. Die konkrete Shell zeigt
        /// den Dialog und fährt bei Bestätigung geordnet herunter.
        /// </summary>
        void RequestShutdown();

        /// <summary>Feuert, wenn eine andere View angezeigt oder erstmals erzeugt wird.</summary>
        event Action? OpenStateChanged;
    }
}
