using NLog;
using NLog.Web;
using Microsoft.EntityFrameworkCore;
using Webzine.EntitiesContext;
using Webzine.Repository;
using Webzine.Repository.Contracts;

// Initiation du logger NLog pour la classe courante afin de pouvoir l'utiliser pour logger des messages d'information, d'erreur, etc avant la construction de l'application.
var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");

try
{
    var builder = WebApplication.CreateBuilder(args);

    // Ajoute les services necessaires pour permettre l'utilisation des
    // controllers avec des vues.
    builder.Services.AddControllersWithViews()
        // Ajoute la compilation des vues lors de l'execution de l'application.
        // Cela nous evite de recompiler l'application a chaque modification de vue.
        // Necessite le package Nuget Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
        .AddRazorRuntimeCompilation();

    builder.Services.AddSingleton<ITitreRepository, LocalEntityRepository>();

    builder.Services.AddDbContext<WebzineDbContext>(options =>
        options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));

    // NLog: Setup NLog for Dependency injection
    builder.Logging.ClearProviders();
    builder.Host.UseNLog();

    var app = builder.Build();

    // Active la possibilite de servir des fichiers statiques presents dans
    // le dossier wwwroot.
    app.UseStaticFiles();

    using (var scope = app.Services.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<WebzineDbContext>();
        db.Database.EnsureCreated();
    }

    // Active le middleware permettant le routage des requetes entrantes.
    app.UseRouting();

    // Ajoute une route pour les zones (Areas) comme Admin
    app.MapControllerRoute(
        name: "areas",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

    // Ajoute un endpoint permettant de router les urls
    // avec la forme /controller/action/id(optionnel).
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Accueil}/{action=Index}/{id?}");

    app.Run();
}
catch (Exception exception)
{
    // NLog: attrape les exceptions non gerees et les logge.
    logger.Error(exception, "Stopped program because of exception");
    throw;
}
finally
{
    // Assure que NLog flush tous les messages de log avant de fermer l'application.
    NLog.LogManager.Shutdown();
}
