using MesaFabApproval.Client;
using MesaFabApproval.Client.Utilities;

using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;

using MudBlazor.Services;
using MesaFabApproval.Client.Services;
using Microsoft.AspNetCore.Components.Authorization;
using System.Net.Http.Headers;
using MudBlazor;

WebAssemblyHostBuilder builder = WebAssemblyHostBuilder.CreateDefault(args);

string _apiBaseUrl = builder.Configuration["FabApprovalApiBaseUrl"] ??
    throw new NullReferenceException("FabApprovalApiBaseUrl not found in config");

string _oldSiteUrl = builder.Configuration["OldFabApprovalUrl"] ??
    throw new NullReferenceException("OldFabApprovalUrl not found in config");

builder.Services.AddTransient<ApiHttpClientHandler>();

builder.Services
    .AddHttpClient("API_Handler", client => {
        client.BaseAddress = new Uri(_apiBaseUrl);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
    });

builder.Services
    .AddHttpClient("API", client => {
        client.BaseAddress = new Uri(_apiBaseUrl);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
    })
    .AddHttpMessageHandler<ApiHttpClientHandler>();

builder.Services
    .AddHttpClient("OldSite", client => {
        client.BaseAddress = new Uri(_oldSiteUrl);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
    });

builder.Services.AddMemoryCache();

builder.Services.AddMudServices(config => {
    config.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomCenter;
    config.SnackbarConfiguration.PreventDuplicates = true;
    config.SnackbarConfiguration.MaxDisplayedSnackbars = 5;
    config.SnackbarConfiguration.SnackbarVariant = Variant.Filled;
    config.SnackbarConfiguration.ShowCloseIcon = true;
    config.SnackbarConfiguration.VisibleStateDuration = 7000;
    config.SnackbarConfiguration.HideTransitionDuration = 500;
    config.SnackbarConfiguration.ShowTransitionDuration = 500;
});

builder.Services.AddScoped<ILocalStorageService, LocalStorageService>();
builder.Services.AddScoped<IAuthenticationService, AuthenticationService>();
builder.Services.AddScoped<ICustomerService, CustomerService>();
builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddScoped<IECNService, ECNService>();
builder.Services.AddScoped<ICAService, CAService>();
builder.Services.AddScoped<IPCRBService, PCRBService>();
builder.Services.AddScoped<IMRBService, MRBService>();
builder.Services.AddScoped<IApprovalService, ApprovalService>();
builder.Services.AddScoped<MesaFabApprovalAuthStateProvider>();
builder.Services.AddScoped<AuthenticationStateProvider>(sp =>
    sp.GetRequiredService<MesaFabApprovalAuthStateProvider>());

builder.Services.AddAuthorizationCore();

builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

await builder.Build().RunAsync();