using Application;
using Domain;
using Infrastructure;
using Infrastructure.Filters;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Website
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      // ServiceCollectionExtensions.AddHNServices(services); // strictement équivalent à la ligne du dessous
      // services.AddHNServicesInMemory();
      services.AddHNServicesEF();
      services.AddControllersWithViews(options =>
      {
        options.Filters.Add<CustomExceptionFilter>();
      });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      //   app.Use(async (context, next) =>
      //   {
      //     try
      //     {
      //       await next();
      //     }
      //     catch (Exception e)
      //     {
      //       context.Response.Redirect("/Error");
      //     }
      //   });

      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      else
      {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
      }
      app.UseHttpsRedirection();
      app.UseStatusCodePagesWithRedirects("/Status/{0}");
      app.UseStaticFiles();

      app.UseRouting();

      //   app.Use(async (context, next) =>
      //   {
      //     Console.WriteLine(">>> Hey");
      //     await next();
      //     Console.WriteLine("<<< Ho");
      //   });

      app.UseAuthorization();

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