using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticNews.Database; using FinlyticNews.Services; using FinlyticNews.Util; using FinlyticNews.Adapters.Discovery; using FinlyticNews.Adapters.Scraping; using FinlyticNews.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = Host.CreateApplicationBuilder(args); builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddScoped(sp => sp.GetRequiredService()); // Register standard HttpClient builder.Services.AddHttpClient(); // Register Core Services builder.Services.AddSingleton(); builder.Services.AddSingleton(typeof(IFinlyticLogger<>), typeof(FinlyticLogger<>)); // Register Discovery Adapters builder.Services.AddSingleton(); builder.Services.AddSingleton(); // Register Detail Scraper Adapters 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(); // Register Non-AI Matching, Validation, Deduplication, and Blocklist Services builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); builder.Services.AddHostedService(sp => sp.GetRequiredService()); builder.Services.AddSingleton(); // Register Scraper and DB Services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); // Register MQTT Client (as singleton hosted service) builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // Register News Background Scraper Service builder.Services.AddHostedService(); var host = builder.Build(); // Auto-run EF database migrations on startup using (var scope = host.Services.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService(); var connStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? ""; await context.MigrateWithBootstrapAsync(connStr); // Seed default article source if empty if (!await context.ArticleSources.AnyAsync()) { context.ArticleSources.Add(new ArticleSourceEntity { Source = "https://www.finanznachrichten.de/rss-aktien-nachrichten", Name = "Finanznachrichten Aktuelle Nachrichten", Type = "rss" }); await context.SaveChangesAsync(); Console.WriteLine("Seeded default ArticleSource."); } } catch (Exception ex) { Console.WriteLine($"Critical error during database migration: {ex.Message}"); Console.WriteLine(ex.StackTrace); } } await host.RunAsync();