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
{
///
/// 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.
///
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(o => o.UseMySql(conn, DatabaseServerVersion.Value));
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
// A-2: neutrale Periodenabrechnung/BWA + Währungs-View (USDC/USD/EUR).
services.AddSingleton();
// 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();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton(new AccountingSystemContracts());
services.AddSingleton();
services.AddHostedService(sp => sp.GetRequiredService());
}
///
/// 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.
///
/// Beim Nachbau zu erhalten (Spezifikation: docs/UI-SPEZIFIKATION-WinForms.md,
/// Originalcode: Git-Tag winforms-final):
///
/// - View-ID accounting.main (stabil – Launcher-Button und Symbol haengen daran)
/// - Titel Accounting, Gruppe Accounting, Order 400
/// - Ein Fenster fuers ganze Modul: AccountingMainForm mit Tabs: Uebersicht+BWA / Ledger / Abruf+Status
///
///
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;
}
}