using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IBKRTrader.Core.Modularity;
///
/// Vertrag für ein IBKRTrader-Modul. Module referenzieren nur den Core, niemals einander.
/// Ein Modul kapselt einen eigenständigen Funktionsbereich (z. B. eine Trading-Strategie)
/// mit eigenen Services, Jobs, DB-Objekten sowie eigenen UI-Ansichten.
///
/// Vorbild: PolytraderSharp IPolyTraderModule.
///
public interface IModule
{
/// Eindeutiger Anzeigename des Moduls, z. B. "CongressTrading".
string Name { get; }
/// DB-Präfix für die Objekte des Moduls (z. B. "ct_"), damit sich Module nicht überschneiden.
string DbPrefix { get; }
///
/// Registriert Services/Jobs des Moduls im DI-Container. Wird beim App-Start aufgerufen,
/// bevor der Host gebaut wird.
///
void RegisterServices(IServiceCollection services, IConfiguration configuration);
///
/// Registriert die UI-Ansichten des Moduls bei der Shell (Launcher). Die Shell öffnet jede Ansicht
/// auf Wunsch in einem eigenen Fenster; Module liefern eigene Forms, die Shell bleibt modul-agnostisch.
///
void RegisterUi(IModuleUiHost host, IServiceProvider services);
///
/// Optionale Vorab-Prüfung, ob das Modul aktiviert werden kann. Gibt null zurück, wenn
/// aktivierbar, sonst einen kurzen Grund (z. B. „IBKR-Gateway nicht konfiguriert").
///
string? GetActivationBlocker(IConfiguration configuration) => null;
/// Wird nach der Core-Initialisierung gestartet (kein Anlaufen gegen leeren State).
Task StartAsync(CancellationToken cancellationToken);
Task StopAsync(CancellationToken cancellationToken);
}