using AyCode.Core.Enums; using AyCode.Core.Loggers; using AyCode.Services.SignalRs; using FruitBank.Common; using FruitBank.Common.Loggers; using FruitBank.Common.Models; using FruitBank.Common.Services; using FruitBankHybrid.Services; using FruitBankHybrid.Services.Loggers; using FruitBankHybrid.Shared.Databases; using FruitBankHybrid.Shared.Services; using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; //using DevExpress.Maui; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Reflection; namespace FruitBankHybrid { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder.UseMauiApp() //.UseDevExpress(useLocalization: false) //.UseDevExpressCollectionView() //.UseDevExpressControls() //.UseDevExpressEditors() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); }); // Load embedded appsettings.json — MAUI has no automatic config file discovery, // so the JSON is shipped as an EmbeddedResource (see FruitBankHybrid.csproj). using (var appsettingsStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FruitBankHybrid.appsettings.json")) { if (appsettingsStream is not null) { var jsonConfig = new ConfigurationBuilder().AddJsonStream(appsettingsStream).Build(); builder.Configuration.AddConfiguration(jsonConfig); } } // Hub-URL-ek EGY forrásból: az fbHub és a loggerHub is az AyCode:Urls:BaseUrl-ből származik. FruitBankConstClient.BaseUrl = builder.Configuration["AyCode:Urls:BaseUrl"] ?? throw new InvalidOperationException("Hiányzik az 'AyCode:Urls:BaseUrl' az appsettings-ből — a hub-ok URL-je ebből származik."); #if DEBUG builder.Services.AddSingleton(); #endif builder.Services.AddSingleton(); // Logger options + framework factory. LoggerClient instances are created per caller category, // with LogLevel from appsettings and writers resolved from DI via IAcLogWriterClientBase. // AppType: a MAUI kliens kód-defaultja Web — az appsettings felülírhatja (pl. Mobile-ra), ha megadja. builder.Services.Configure(builder.Configuration.GetSection("AyCode:Logger")); builder.Services.AddAcLoggerFactory(AppType.Web); // Bind SignalR options from configuration. // Precedence: code default → appsettings.json (this line) → any later Configure action. builder.Services.Configure(opts => { builder.Configuration.GetSection("AcHubConnection").Bind(opts); // Az fbHub URL a közös BaseUrl-ből (nem külön AcHubConnection:Url) — így nem tud eltérni a loggerHub-tól. opts.Url = $"{FruitBankConstClient.BaseUrl}/{FruitBankConstClient.DefaultHubName}"; }); builder.Services.Configure(builder.Configuration.GetSection("AcBinaryHubProtocol")); // Add device-specific services used by the FruitBankHybrid.Shared project builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => new LoggedInModel(sp.GetRequiredService())); // SignalR HubConnectionBuilder — transient so each consumer gets a fresh builder to Build(). // All connection and protocol configuration flows from appsettings.json via IOptions; // AddAcDefaults (framework) applies AcHubConnectionOptions and bridges the provided logger into SignalR's internal pipeline. // NOTE: AcBinaryHubProtocolOptions is resolved from the OUTER service provider and passed // explicitly — HubConnectionBuilder's inner DI cannot see outer services.Configure() registrations. builder.Services.AddTransient(sp => { var loggerFactory = sp.GetRequiredService>(); var connectionOpts = sp.GetRequiredService>().Value; var protocolOpts = sp.GetRequiredService>().Value; var logger = loggerFactory(nameof(FruitBankSignalRClient)); var hubBuilder = new HubConnectionBuilder().AddAcDefaults(logger, connectionOpts); hubBuilder.AddAcBinaryProtocol(protocolOpts); return hubBuilder; }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddMauiBlazorWebView(); builder.Services.AddDevExpressBlazor(configure => configure.SizeMode = DevExpress.Blazor.SizeMode.Medium); #if DEBUG builder.Services.AddBlazorWebViewDeveloperTools(); builder.Logging.AddDebug(); #endif return builder.Build(); } } }