using MongoDB.Driver;
using OnlyOneAccessTemplate.Services;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container
builder.Services.AddControllersWithViews();

// Session support
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// MongoDB Configuration
builder.Services.AddSingleton<IMongoClient>(sp =>
{
    var connectionString = builder.Configuration.GetConnectionString("MongoDB");
    return new MongoClient(connectionString);
});

builder.Services.AddScoped(sp =>
{
    var client = sp.GetRequiredService<IMongoClient>();
    var databaseName = builder.Configuration.GetValue<string>("MongoDB:DatabaseName");
    return client.GetDatabase(databaseName);
});

// Custom Services
builder.Services.AddScoped<ISiteConfigurationService, SiteConfigurationService>();
builder.Services.AddScoped<ILanguageService, LanguageService>();
builder.Services.AddScoped<ISeoService, SeoService>();
builder.Services.AddScoped<IConversionService, ConversionService>();

// HttpClient for external calls
builder.Services.AddHttpClient<ConversionService>();

// Response Compression
builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
});

// Response Caching
builder.Services.AddResponseCaching();

// Memory Cache
builder.Services.AddMemoryCache();

var app = builder.Build();

// Configure the HTTP request pipeline
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

// Session
app.UseSession();

// Response Compression & Caching
app.UseResponseCompression();
app.UseResponseCaching();

app.UseRouting();

// Custom routing for multilingual support
app.MapControllerRoute(
    name: "default-pt",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "pt-explicit",
    pattern: "pt/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "english",
    pattern: "en/{controller=En}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "spanish",
    pattern: "es/{controller=Es}/{action=Index}/{id?}");

// SEO Routes
app.MapGet("/sitemap.xml", async (ISiteConfigurationService siteConfig) =>
{
    var sitemap = await siteConfig.GenerateSitemapAsync();
    return Results.Content(sitemap, "application/xml");
});

app.MapGet("/robots.txt", async (ISiteConfigurationService siteConfig) =>
{
    var robots = await siteConfig.GenerateRobotsAsync();
    return Results.Content(robots, "text/plain");
});

app.Run();