using DAL;
using HRD.AppLogger;
using HRD.WebApi;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;
using StaffDBServer.Extends;
using StaffDBServer.SharedExtensions;
using System;
using System.Reflection;
using HRD.LDAPService.JWT;
using HRD.WebApi.DAL.Middleware;
using HRD.WebApi.Helpers;

AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) =>
{
    ILoggerManager logger = new LoggerManager();
    logger.LogException((Exception)unhandledExceptionEventArgs.ExceptionObject, "Application closed due to exception.");
    NLog.LogManager.Flush();
};

IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", true, true).Build();

WebApiConfig.Init(configuration, Assembly.GetExecutingAssembly().GetName());

ILoggerManager logger = new LoggerManager();
logger.LogWarn($"[Start WebApi Server] BaseDirectory: {AppDomain.CurrentDomain.BaseDirectory}; TargetFrameworkName: {AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName}");

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

    // Configure logging
    builder.Logging.ClearProviders();
    builder.Logging.SetMinimumLevel(LogLevel.Warning);
    builder.Host.UseNLog();

    // Add services to the container
    builder.Services.ConfigureWebApiExtensionsAtFirst(); // at first
    builder.Services.ConfigureRepositoryWrapper(); // add repos

    var cnnStr = WebApiConfig.ConnectionString(EN_ConnectionType.SQLServer);

    builder.Services.AddDbContext<WebApiContext>(options =>
    {
        const int dbTimeoutInMin = 5;
        options.UseSqlServer(cnnStr,
            opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(dbTimeoutInMin).TotalSeconds));
    });

    builder.Services.AddStaffDBRepositories();
    builder.Services.ConfigureWebApiExtensionsEnd(); // should come last

    var app = builder.Build();

    ((IApplicationBuilder)app).ApplicationServices.SetupNLogServiceLocator();


    // Configure the HTTP request pipeline
    if (app.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.AddCustomExceptionHandling();
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseCors("AllowAllOrigins");
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseOpenApi();
    app.UseDALMiddleware();
    app.UseJwtMiddleware();
    app.ConfigureSwagger();

    app.MapControllers();

    app.Run();

}
catch (Exception ex)
{
    logger.LogException(ex, "Stopped program because of exception");
    throw;
}
finally
{
    // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
    NLog.LogManager.Flush();
    NLog.LogManager.Shutdown();
}