using CommonLib;
using Microsoft.OpenApi.Models;
using MMWebApi.Filters;
using MMWebApiEngine.Components;
using MMWebApiEngine.Services;
using Serilog;

var builder = WebApplication.CreateBuilder(args);
ConfigurationManager configuration = builder.Configuration;
// Add Filter with config to scope

builder.Services.AddScoped<HttpAuthroizationFilter>();
builder.Services.AddScoped<ILoginService, LoginService>();

builder.Services.AddSingleton<IDatabase, Database>();
builder.Services.AddSingleton<IMessage, Message>();

// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
// Swagger
builder.Services.AddSwaggerGen(
    c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "MMWebApi", Version = "v1" });

    c.AddSecurityDefinition("SessionId", new OpenApiSecurityScheme
    {
        Description = "Enter SessionId",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Scheme = "SessionId"
    });

    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id = "SessionId"
                            },
                            Scheme = "oauth2",
                            Name = "SessionId",
                            In = ParameterLocation.Header,

                        },
                        new List<string>()
                    }
                });
}
);
// Serilog
builder.Host.UseSerilog((ctx, lc) =>
    lc.WriteTo.Console()
    .MinimumLevel.Verbose()
    .WriteTo.File(configuration["Paths:LogPath"], rollingInterval: RollingInterval.Day));

Log.Information($"MMWebApiService Started Ver.[{Globals.VERSION}]");

builder.WebHost.UseUrls("http://*:5000");

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment() || app.Environment.IsEnvironment("Local"))
{
    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI(
    //    c =>
    //{
    //    c.SwaggerEndpoint("/swagger/v1/swagger.json", "MMWebApi v1");
    //    c.RoutePrefix = String.Empty;
    //}
    );
}

app.UseCors(builder =>
{
    builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader();
});

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

//app.UseHttpsRedirection();


app.Run();