using System.Runtime.Serialization.Formatters;
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using SiteManagementSystem_SoftwareEngineering_.Extension;
using SiteManagementSystem_SoftwareEngineering_.Interface;
using SiteManagementSystem_SoftwareEngineering_.Service;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<SQLService>(options =>
    options.UseMySql(
        builder.Configuration.GetConnectionString("SQL"),
        MariaDbServerVersion.AutoDetect(builder.Configuration.GetConnectionString("SQL"))
    )
);
builder
    .Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        var jwtConfig = builder.Configuration.GetSection("Jwt");
        var key = Encoding.UTF8.GetBytes(jwtConfig.GetValue<string>("SecurityKey")!);
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = jwtConfig.GetValue<string>("Issuer"),
            ValidAudience = jwtConfig.GetValue<string>("Audience"),
            IssuerSigningKey = new SymmetricSecurityKey(key)
        };
    });
builder
    .Services.AddTokenFactory(options =>
    {
        var config = builder.Configuration.GetSection("Jwt");
        options.Issuer = config.GetValue<string>("Issuer")!;
        options.Audience = config.GetValue<string>("Audience")!;
        options.SigningKey = config.GetValue<string>("SecurityKey")!;
        options.AccessTokenExpire = config.GetValue<int>("AccessTokenExpire");
        options.RefreshTokenExpire = config.GetValue<int>("RefreshTokenExpire");
        options.RefreshTokenBefore = config.GetValue<int>("RefreshTokenBefore");
    })
    .AddUserManager(options =>
        options.HashSalt = builder.Configuration.GetValue<string>("SecretSalt")!
    ).AddScoped<IFieldService, FieldService>();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();