using IBKRTrader.Core.Database.Migrations; using IBKRTrader.Core.Logging; using IBKRTrader.Core.Settings; using IBKRTrader.Core.Workers; using IBKRTrader.Modules.CongressTrading; using IBKRTrader.UI; namespace IBKRTrader; public partial class Form1 : Form { private readonly LoggingService _logger; private readonly WorkerEngine _workerEngine; private readonly SettingsService _settings; private readonly CoreMigrations _migrations; private readonly IBKRMigrations _ibkrMigrations; private readonly IServiceProvider _services; private LogPanelController? _logPanel; public Form1( LoggingService logger, WorkerEngine workerEngine, SettingsService settings, CoreMigrations migrations, IBKRMigrations ibkrMigrations, IServiceProvider services) { InitializeComponent(); _logger = logger; _workerEngine = workerEngine; _settings = settings; _migrations = migrations; _ibkrMigrations = ibkrMigrations; _services = services; } // ─── Form-Events ────────────────────────────────────────────────────────── protected override void OnLoad(EventArgs e) { base.OnLoad(e); InitializeLogPanel(); InitializeWorkerList(); InitializeSettingsGrid(); _ = StartupAsync(); } protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); // Worker sauber beenden (feuert & vergisst – Form muss kurz warten) _workerEngine.StopAllAsync().GetAwaiter().GetResult(); } // ─── Initialisierung ────────────────────────────────────────────────────── private void InitializeLogPanel() { // RichTextBox auf Dock.Fill setzen rtb_logs.Dock = DockStyle.Fill; _logPanel = new LogPanelController(rtb_logs, _logger); // LogLevel aus Settings setzen var levelStr = _settings.Settings.Logging.Level; if (Enum.TryParse(levelStr, true, out var level)) _logger.SetMinLevel(level); } private void InitializeWorkerList() { WorkerListBindingSource.Setup(dgv_workerlist, _workerEngine.WorkerInfos); } private void InitializeSettingsGrid() { pg_settings.SelectedObject = _settings.Settings; } // ─── Async Startup ──────────────────────────────────────────────────────── private async Task StartupAsync() { _logger.Info("Core", "=== IBKRTrader startet ==="); _logger.Info("Core", $"Version: 1.0.0 | .NET {Environment.Version}"); // DB-Verbindung testen und Core-Migrationen laufen lassen try { _logger.Info("Core", "Verbinde mit Datenbank..."); await _migrations.RunAsync(); await _ibkrMigrations.RunAsync(); } catch (Exception ex) { _logger.Error("Core", "Core-Datenbankfehler beim Start.", ex); } // Modul-Migrationen try { await CongressTradingModule.InitializeAsync(_services); } catch (Exception ex) { _logger.Error("CT", "CongressTrading-Migrationen fehlgeschlagen.", ex); } // Worker starten await _workerEngine.StartAllAsync(); _logger.Info("Core", "IBKRTrader bereit."); UpdateStatusBar("Bereit"); } // ─── StatusBar ──────────────────────────────────────────────────────────── private void UpdateStatusBar(string text) { if (statusStrip1.InvokeRequired) statusStrip1.BeginInvoke(() => UpdateStatusBar(text)); else { // Vorhandenes Label nutzen oder neues anlegen if (statusStrip1.Items.Count == 0) statusStrip1.Items.Add(new ToolStripStatusLabel()); statusStrip1.Items[0].Text = $"Status: {text} | {DateTime.Now:HH:mm:ss}"; } } }