using System; using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticSentiment.Database; using FinlyticSentiment.Services; using FinlyticSentiment.Util; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = Host.CreateApplicationBuilder(args); // Register PostgreSQL DbContext for sentiment data & settings builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddScoped(sp => sp.GetRequiredService()); // Register Core Services builder.Services.AddSingleton(); builder.Services.AddSingleton(typeof(IFinlyticLogger<>), typeof(FinlyticLogger<>)); // Register HttpClient builder.Services.AddHttpClient(); // Register Sentiment Services builder.Services.AddScoped(); builder.Services.AddSingleton(); // Register MQTT Client (as singleton hosted service) builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // Register Sentiment Background Worker builder.Services.AddHostedService(); var host = builder.Build(); // Auto-migrate database on startup using (var scope = host.Services.CreateScope()) { try { var db = scope.ServiceProvider.GetRequiredService(); var connStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? ""; await db.MigrateWithBootstrapAsync(connStr); } catch (Exception ex) { Console.WriteLine($"Critical error during database migration for FinlyticSentiment: {ex.Message}"); } } await host.RunAsync();