using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace PolyTrader.Core.Modularity
{
///
/// Vertrag für ein PolyTrader-Modul. Module referenzieren nur den Core, niemals
/// einander. Ein Modul kapselt einen eigenständigen Funktionsbereich (z.B. Copytrading)
/// mit eigenen Services, Jobs, DB-Objekten sowie eigenen UI-Ansichten und Settings-Sektionen.
///
public interface IPolyTraderModule
{
/// Eindeutiger Anzeigename des Moduls, z.B. "CopyTrading".
string Name { get; }
///
/// Namespace-Präfix für die DB-Objekte des Moduls (z.B. "ct_"), damit sich Module
/// nicht in die Quere kommen.
///
string DbPrefix { get; }
///
/// Registriert die 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 Host-Fenster. Module liefern eigene Forms;
/// die Shell bleibt modul-agnostisch. Über lösen Module ihre
/// Abhängigkeiten (Repos, State) für die View-Erzeugung auf.
///
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, im Dashboard anzeigbaren Grund (z.B. „Alchemy-API-Key fehlt").
/// Default: immer aktivierbar. Module überschreiben dies bei harten Voraussetzungen.
///
string? GetActivationBlocker(IConfiguration configuration) => null;
/// Wird nach der Core-Hydration gestartet (kein Anlaufen gegen leeren State).
Task StartAsync(CancellationToken cancellationToken);
Task StopAsync(CancellationToken cancellationToken);
}
}