using System; using System.Net.Http; using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticCore.Services.Yahoo; using FinlyticSimulation.Database; using FinlyticSimulation.Services; using FinlyticSimulation.Services.Mqtt; using FinlyticSimulation.Util; using FinlyticTechnicals.Patterns; using FinlyticTechnicals.Patterns.Candlesticks; using FinlyticTechnicals.Patterns.ChartPatterns; using FinlyticTechnicals.Patterns.SmartMoney; using FinlyticTechnicals.Services; using FinlyticTechnicals.Strategies; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = Host.CreateApplicationBuilder(args); // 1. Register DbContext & Settings 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 & Yahoo Scraper builder.Services.AddHttpClient() .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { UseCookies = true, CookieContainer = new System.Net.CookieContainer() }); builder.Services.AddSingleton(); builder.Services.AddTransient(); // 4. Register Pattern Detectors (100% Code-Reuse from FTA) builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // 5. Register Technical Strategies (100% Code-Reuse from FTA) builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // 6. Register Quant Simulation Engine builder.Services.AddSingleton(); // 7. Register MQTT Client & RPC Bridge builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // 8. Register Scheduled Reliability Matrix Recompute builder.Services.AddHostedService(); var host = builder.Build(); // Run 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 FinlyticSimulation."); } catch (Exception ex) { Console.WriteLine($"Migration notice on startup: {ex.Message}"); } } await host.RunAsync();