using Microsoft.EntityFrameworkCore;
using Npgsql;
using Npgsql.NameTranslation;
using KernelRecordsMVC.Domain.Enums;
using KernelRecordsMVC.Infrastructure.Data;

var builder = WebApplication.CreateBuilder(args);

// ==========================================
// AUTHENTICATION
// ==========================================

builder.Services
    .AddAuthentication("Cookies")
    .AddCookie("Cookies", options =>
    {
        options.LoginPath = "/Account/Login";
        options.AccessDeniedPath = "/Account/Login";
        options.ExpireTimeSpan = TimeSpan.FromHours(8);
        options.SlidingExpiration = true;
    });

builder.Services.AddAuthorization();

builder.Services.AddControllersWithViews();

// ==========================================
// DATABASE
// ==========================================

var dataSourceBuilder = new NpgsqlDataSourceBuilder(
    builder.Configuration.GetConnectionString("KernelRecords"));

var nameTranslator = new NpgsqlNullNameTranslator();

dataSourceBuilder.MapEnum<AdminType>(
    "project.admin_type",
    nameTranslator);

dataSourceBuilder.MapEnum<ProductFormat>(
    "project.product_format",
    nameTranslator);

dataSourceBuilder.MapEnum<PaymentMethodType>(
    "project.payment_method_type",
    nameTranslator);

dataSourceBuilder.MapEnum<OrderStatusType>(
    "project.order_status_type",
    nameTranslator);

dataSourceBuilder.MapEnum<ModificationType>(
    "project.modification_type",
    nameTranslator);

dataSourceBuilder.MapEnum<ArtistReleaseType>(
    "project.artist_release_type",
    nameTranslator);

var dataSource = dataSourceBuilder.Build();

builder.Services.AddDbContext<KernelRecordsContext>(options =>
    options.UseNpgsql(dataSource));

// ==========================================
// SESSION
// ==========================================

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

var app = builder.Build();

// ==========================================
// MIDDLEWARE
// ==========================================

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseSession();

app.UseAuthentication();

app.UseAuthorization();

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

app.Run();
