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

namespace PolyTrader.Modules.Accounting
{
    /// <summary>
    /// Modul „Accounting": vollständige, von unserer Trading-DB UNABHÄNGIGE, buchhalterisch korrekte
    /// Erfassung aller Transaktionen der Live-Accounts (direkte Polymarket-/On-Chain-Abrufe → append-only
    /// Ledger). Reines Ingest-/Reporting-Modul, KEIN Handel. Konzept: docs/konzepte/KONZEPT-Modul-Accounting.md.
    ///
    /// A-1 (dieser Slice): Modul + acc_-Persistenz + pure Klassifikation + idempotenter Ingest hinter
    /// Interfaces (Null-Quellen offline; Live-Abruf im Zielland) + Ledger-/Status-UI. A-2 Abrechnung/BWA/FX,
    /// A-3 US-Steuerschicht, A-4 CSV/PDF-Export folgen.
    /// </summary>
    public class AccountingModule : IPolyTraderModule
    {
        public string Name => "Accounting";
        public string DbPrefix => "acc_";

        public void RegisterServices(IServiceCollection services, IConfiguration configuration)
        {
            var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty;
            services.AddDbContextFactory<AccountingDbContext>(o => o.UseMySql(conn, DatabaseServerVersion.Value));

            services.AddSingleton<ILedgerRepository, EfLedgerRepository>();
            services.AddSingleton<IIngestRunRepository, EfIngestRunRepository>();
            services.AddSingleton<IRawSnapshotRepository, EfRawSnapshotRepository>();
            services.AddSingleton<IFxRateRepository, EfFxRateRepository>();

            // A-2: neutrale Periodenabrechnung/BWA + Währungs-View (USDC/USD/EUR).
            services.AddSingleton<Services.AccountingReportService>();

            // Ingest-Quellen: offline Null-Stubs (das Modul läuft ohne Live-Anbindung und bucht korrekt
            // nichts). Im Zielland werden die echten Quellen (Polymarket /activity, Alchemy-Transfers,
            // GetUsdcBalanceAsync) + die System-Contract-Whitelist registriert. Muster wie RF.
            services.AddSingleton<IActivitySource, NullActivitySource>();
            services.AddSingleton<ITransferSource, NullTransferSource>();
            services.AddSingleton<IBalanceAnchorSource, NullBalanceAnchorSource>();
            services.AddSingleton(new AccountingSystemContracts());

            services.AddSingleton<AccountingIngestService>();
            services.AddHostedService(sp => sp.GetRequiredService<AccountingIngestService>());
        }

        /// <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>accounting.main</c> (stabil – Launcher-Button und Symbol haengen daran)</item>
        ///   <item>Titel <c>Accounting</c>, Gruppe <c>Accounting</c>, Order <c>400</c></item>
        ///   <item>Ein Fenster fuers ganze Modul: AccountingMainForm mit Tabs: Uebersicht+BWA / Ledger / Abruf+Status</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;
    }
}
