using System; using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticEngine.Database; using FinlyticEngine.Services.Ai; using FinlyticEngine.Services.Derivatives; using FinlyticEngine.Services.Mqtt; using FinlyticEngine.Services.Scoring; using FinlyticEngine.Services.Trading; using FinlyticEngine.Util; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = Host.CreateApplicationBuilder(args); // 1. Register DbContext & Settings Provider builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddScoped(sp => sp.GetRequiredService()); // 2. Register Core Services & Logger builder.Services.AddSingleton(); builder.Services.AddSingleton(typeof(IFinlyticLogger<>), typeof(FinlyticLogger<>)); // 3. Register HTTP Client & AI Gate builder.Services.AddHttpClient(); builder.Services.AddSingleton(); // 4. Register MQTT Client & RPC Bridge builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // 5. Register Engine Domain Services // builder.Services.AddSingleton(); // V1 Fallback builder.Services.AddSingleton(); // V2 Bidirectional Active builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // 6. Register Background Poller & Monitoring Services builder.Services.AddHostedService(); builder.Services.AddHostedService(); var host = builder.Build(); // 7. Startup database migrations using (var scope = host.Services.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService(); var connStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? ""; await context.MigrateWithBootstrapAsync(connStr); Console.WriteLine("Database migrations successfully executed for FinlyticEngine."); } catch (Exception ex) { Console.WriteLine($"Migration notice on startup: {ex.Message}"); } } await host.RunAsync();