using Kalaha.Api.Database;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// ==========================================
// 1. CORS KONFIGURATION
// Erlaubt deinem Blazor-Frontend (das auf einem anderen Port läuft),
// Anfragen an diese API zu senden. (Für debugging, da mit dem loadbalancer das problem gelöst ist)
// ==========================================
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll", policy =>
    {
        // Für die lokale Entwicklung erlauben wir alles. 
        policy.AllowAnyOrigin()
              .AllowAnyHeader()
              .AllowAnyMethod();
    });
});

// ==========================================
// 2. DATENBANK KONFIGURATION (EF Core & PostgreSQL)
// ==========================================
// Der ConnectionString wird später über Docker-Umgebungsvariablen oder die appsettings.json gesetzt.
string? connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
if(connectionString is null)
{
    throw new InvalidDataException("Connection string is missing");
}

builder.Services.AddDbContext<KalahaDbContext>(options =>
    options.UseNpgsql(connectionString));

// ==========================================
// 3. JWT AUTHENTIFIZIERUNG
// ==========================================
// Der geheime Schlüssel muss auf beiden Instanzen gleich sein!
string? jwtKey = builder.Configuration["Jwt:Key"];
if (jwtKey is null)
{
    throw new InvalidDataException("Jwt key is missing");
}
if(builder.Configuration["Jwt:Issuer"] is null || builder.Configuration["Jwt:Audience"] is null)
{
    throw new InvalidDataException("Jwt issuer or audience is missing");
}

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

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

var app = builder.Build();

//// ==========================================
//// 4. AUTOMATISCHE DATENBANK-MIGRATION (PFLICHT FÜR DIE UNI-AUFGABE!)
//// Wendet beim Start sofort alle Tabellen-Änderungen an. Kein manuelles Setup nötig!
//// ==========================================
using (var scope = app.Services.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<KalahaDbContext>();

    // Prüft, ob die DB existiert und führt Migrationen aus.
    // Wichtig: Try-Catch ist gut, falls die DB beim Starten noch 1-2 Sekunden braucht (Docker).
    // Wir geben Postgres jetzt 30 Sekunden Zeit zum Hochfahren!
    for (int i = 0; i < 10; i++)
    {
        try
        {
            dbContext.Database.Migrate();
            Console.WriteLine("Datenbank erfolgreich verbunden und Tabellen erstellt!");
            break;
        }
        catch (Exception ex)
        {
            if (i == 9) throw; // Erst nach dem 10. Versuch aufgeben
            Console.WriteLine($"Warte auf Datenbank... Versuch {i + 1}/10. ({ex.Message})");
            Thread.Sleep(3000); // 3 Sekunden warten
        }
    }
}

// ==========================================
// MIDDLEWARE PIPELINE
// ==========================================
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseCors("AllowAll");

app.UseAuthentication(); // Prüft wer du bist (Token validieren)
app.UseAuthorization();  // Prüft was du darfst

app.MapControllers();

app.Run();