using System.Collections.Concurrent;
using System.Net.WebSockets;
using System.Text;
using AlsimHolidaysAPI;
using AlsimHolidaysAPI.Models;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Net.Http.Headers;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();


//builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddSwaggerGen();


builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("SQLConnection")));



var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";



builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
        builder => builder.WithOrigins( "wss://devapi.planner.meesedev.co.uk", "https://planner.meesedev.co.uk", "https://devplanner.meesedev.co.uk", "http://localhost:4200")
                            .AllowAnyMethod()
                          .AllowAnyHeader()
                          .AllowCredentials());
});







// Bind HttpClientOptions configuration
builder.Services.Configure(builder.Configuration.GetSection("HttpClientOptions"));

// Configure HttpClient
builder.Services.AddHttpClient("MyHttpClient", client =>
{
    var httpClientOptions = builder.Configuration.GetSection("HttpClientOptions").Get();
    client.MaxResponseContentBufferSize = httpClientOptions.MaxResponseContentBufferSize;
});


// JWT Authentication configuration start
var key = Encoding.ASCII.GetBytes(builder.Configuration["Jwt:Key"]);



builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidAudience = builder.Configuration["Jwt:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateLifetime = true
    };
}); 


builder.Services.AddHttpContextAccessor(); // Required for accessing HttpContext

//builder.Services.AddHttpClient();


// JWT Authentication configuration end



builder.Services.AddControllers();

var app = builder.Build();



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


app.UseRouting();


app.UseCors(MyAllowSpecificOrigins);

app.UseHttpsRedirection();
app.UseAuthentication(); //added with JWT Authentication
app.UseAuthorization();



app.MapControllers();


app.Run();