using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using PolyTrader.Core.Modularity;
using PolyTrader.Modules.Supervisor.Services;

namespace PolyTrader.Modules.Supervisor
{
    /// <summary>
    /// Supervisor-Modul (docs/konzepte/KONZEPT-Modul-Supervisor.md): Analyse/Forensik über ALLE
    /// Module — strikt read-only (kein Handel). S-1: Dossier-Browser über Entscheidungsjournal,
    /// Order-Events, Trade-Log und JSONL-Logs. S-2 (OpenRouter-Agent + Tool-Registry), S-3
    /// (Profile/Berichte/Counterfactual/Predictalytics) und S-4 (MCP-Light) folgen.
    /// </summary>
    public class SupervisorModule : IPolyTraderModule
    {
        public string Name => "Supervisor";
        public string DbPrefix => "sup_";

        public void RegisterServices(IServiceCollection services, IConfiguration configuration)
        {
            // S-1: Dossier-Beschaffung/-Aufbereitung.
            services.AddSingleton<DossierService>();

            // S-2: read-only Tool-Registry + OpenRouter-Agent. Der API-Key kommt aus
            // POLYTRADER_OPENROUTER_KEY bzw. gitignorierter openrouter.key (getrennt vom Trading).
            services.AddSingleton(sp => Agent.SupervisorTools.CreateRegistry(
                sp.GetRequiredService<PolyTrader.Core.Persistence.IDecisionJournal>(),
                sp.GetRequiredService<PolyTrader.Core.Persistence.IOrderEventLog>(),
                sp.GetRequiredService<PolyTrader.Core.Persistence.ITradeLogRepository>(),
                sp.GetRequiredService<DossierService>(),
                sp.GetRequiredService<Persistence.ISupervisorCounterfactualRepository>()));
            services.AddSingleton<Agent.IChatCompletionClient>(_ =>
                new Agent.OpenRouterClient(new System.Net.Http.HttpClient { Timeout = TimeSpan.FromMinutes(3) }));
            services.AddSingleton<Agent.SupervisorAgent>();

            // S-3: sup_-Persistenz (gespeicherte Analysen/Berichte).
            var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty;
            services.AddDbContextFactory<Persistence.SupervisorDbContext>(o =>
                o.UseMySql(conn, PolyTrader.Core.Configuration.DatabaseServerVersion.Value));
            services.AddSingleton<Persistence.ISupervisorReportRepository, Persistence.EfSupervisorReportRepository>();
            services.AddSingleton<Persistence.ISupervisorCounterfactualRepository, Persistence.EfSupervisorCounterfactualRepository>();

            // S-3: Counterfactual-Job (abgelehnte BUYs vs. Marktausgang) + täglicher Bericht
            // (OPT-IN via POLYTRADER_SUPERVISOR_DAILY = Stunde 0–23).
            services.AddSingleton<Counterfactual.ICounterfactualResolutionSource, Counterfactual.ApiCounterfactualResolutionSource>();
            services.AddHostedService<Counterfactual.CounterfactualJob>();
            services.AddHostedService<Services.DailyReportService>();

            // S-4: MCP-Light – exponiert die read-only Tool-Registry für externe KI-Clients
            // (z. B. Claude Code). OPT-IN via POLYTRADER_MCP_PORT, bindet nur 127.0.0.1.
            services.AddHostedService<Mcp.McpLightServer>();
        }

        /// <summary>
        /// Aktuell ohne Ansicht: Die WinForms-UI wurde mit der Linux-Portierung entfernt, die
        /// Avalonia-Ansicht folgt (Stufe L3/L4). Die Fachlogik dieses Moduls laeuft davon
        /// unabhaengig weiter – die Shell zeigt schlicht kein Fenster fuer das Modul an.
        ///
        /// <para><b>Beim Nachbau zu erhalten</b> (Spezifikation: docs/UI-SPEZIFIKATION-WinForms.md,
        /// Originalcode: Git-Tag <c>winforms-final</c>):</para>
        /// <list type="bullet">
        ///   <item>View-ID <c>supervisor.main</c> (stabil – Launcher-Button und Symbol haengen daran)</item>
        ///   <item>Titel <c>Supervisor</c>, Gruppe <c>Supervisor</c>, Order <c>300</c></item>
        ///   <item>Ein Fenster fuers ganze Modul: SupervisorMainForm mit Tabs: Analyse (Chat) / Dossiers / Berichte / Counterfactual</item>
        /// </list>
        /// </summary>
        public void RegisterUi(IModuleUiHost host, IServiceProvider services)
        {
            // Bewusst leer, bis die Avalonia-Ansicht steht (siehe Doku oben).
        }

        public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;

        public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
    }
}
