using System;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Channels;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using PolyTrader.Core.Configuration;
using PolyTrader.Core.Modularity;
using PolyTrader.Core.Streaming;
using PolyTrader.Modules.CopyTrading.Persistence;
using PolyTrader.Modules.CopyTrading.Persistence.Ef;
using PolyTrader.Modules.CopyTrading.Ui;
using PolyTraderSharp;
using PolyTraderSharp.Models;
using PolyTraderSharp.Services;
namespace PolyTrader.Modules.CopyTrading
{
///
/// Das Copytrading-Modul: registriert seinen eigenen State, seine Channels, sein
/// Trade-Log-Repository und seine Services selbst. Die App kennt nur den Contract.
///
public class CopyTradingModule : IPolyTraderModule
{
public string Name => "CopyTrading";
public string DbPrefix => "ct_";
public void RegisterServices(IServiceCollection services, IConfiguration configuration)
{
// Copytrading-Hot-Path-State
services.AddSingleton();
// Signal-/Trade-Channels des Moduls
var copySignalChannel = Channel.CreateUnbounded();
var closedTradeChannel = Channel.CreateUnbounded();
services.AddSingleton(copySignalChannel.Writer);
services.AddSingleton(copySignalChannel.Reader);
services.AddSingleton(closedTradeChannel.Writer);
services.AddSingleton(closedTradeChannel.Reader);
// Modul-Persistenz: EF Core / Pomelo / MySQL (thread-safer DbContextFactory).
var conn = configuration["Database:MySqlConnectionString"] ?? string.Empty;
services.AddDbContextFactory(o => o.UseMySql(conn, DatabaseServerVersion.Value));
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
// WSS-Infrastruktur (Core) wird nur vom Copytrading-Blockchain-Listener genutzt.
services.AddSingleton();
// Modul-Services (Signalquelle, Ausführung, Analytics)
services.AddSingleton();
services.AddHostedService(sp => sp.GetRequiredService());
services.AddHostedService();
services.AddHostedService();
services.AddHostedService();
// Persistiert die geschlossenen Copytrades (Modul-Channel -> Modul-Log + Core-Log).
services.AddHostedService();
// WSS-Listener des Moduls: Blockchain (Alchemy → Master-Trader-Wallets) und
// Polymarket-Markt-WSS (Auto-Redeem nach Copytrading-Settings).
services.AddHostedService();
services.AddHostedService();
// Phase 0.1: SELL-Eskalationsleiter (preist offene Exit-Limits stufenweise nach).
services.AddHostedService();
}
public void RegisterUi(IModuleUiHost host, IServiceProvider services)
{
// EIN Fenster fürs ganze Modul: die einzelnen Ansichten sind Tabs im
// CopyTradingMainForm (Master-Trader / geschlossene Trades / Account-Einstellungen).
// So bleibt der Launcher schlank – ein Button je Modul statt je View.
host.RegisterView(new ModuleView
{
Id = "copytrading.main",
Title = "Copytrading",
Group = "CopyTrading",
Order = 100,
CreateForm = () =>
{
var form = new CopyTradingMainForm();
form.Initialize(services);
return form;
}
});
}
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
}