//using Microsoft.AspNetCore.Authentication.Cookies;
//using Microsoft.AspNetCore.HttpOverrides;
//using Microsoft.EntityFrameworkCore;
//using WerksverkaufScanner.Data;
//using WerksverkaufScanner.Services;

//var builder = WebApplication.CreateBuilder(args);

//// Optional: explizit Port/Bind-Adresse setzen
//builder.WebHost.UseUrls("https://0.0.0.0:3300");
////builder.WebHost.UseUrls("http://0.0.0.0:3300");

//// 1) ConnectionString prüfen
//var cs = builder.Configuration.GetConnectionString("Default");
//if (string.IsNullOrWhiteSpace(cs))
//    throw new InvalidOperationException("ConnectionStrings:Default fehlt oder ist leer.");

//// 2) Framework-Services
//builder.Services.AddRazorPages();
//builder.Services.AddServerSideBlazor();
//builder.Services.AddControllers();          // für AuthController (Login/Logout)
//builder.Services.AddHttpClient();           // für Logout/Calls aus Layout/Login
//builder.Services.AddHttpContextAccessor();  // falls Services HttpContext brauchen

//// 3) Auth/Authorization (Cookie)
//builder.Services
//    .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
//    .AddCookie(o =>
//    {
//        o.LoginPath = "/login";                 // ohne Auth -> Redirect hierher
//        o.AccessDeniedPath = "/login";
//        o.ReturnUrlParameter = "returnUrl";
//        o.SlidingExpiration = true;
//        o.ExpireTimeSpan = TimeSpan.FromDays(7);

//        // Cookie-Härtung
//        o.Cookie.Name = "Werksverkauf.Auth";
//        o.Cookie.HttpOnly = true;
//        o.Cookie.SecurePolicy = CookieSecurePolicy.None; // nur über HTTPS eigentlich .Always
//        o.Cookie.SameSite = SameSiteMode.Lax;              // für normale Navigations-Requests
//    });
//builder.Services.AddAuthorization();

//// 4) App-Services & Datenzugriff
//builder.Services.AddDbContextFactory<ScannerDb>(opt => opt.UseSqlServer(cs));
//builder.Services.AddSingleton<StammdatenCache>();
//builder.Services.AddScoped<InventurService>();
//builder.Services.AddScoped<AuthService>();  // prüft KassenLogin in DB

//// (Optional) Forwarded Headers, wenn hinter Proxy/LoadBalancer (NGINX/IIS/K8s)
//builder.Services.Configure<ForwardedHeadersOptions>(opt =>
//{
//    opt.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
//    // opt.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); // bei Bedarf setzen
//});

//var app = builder.Build();

//// 5) Middleware-Pipeline
//app.UseForwardedHeaders();   // vor allem anderen, wenn Proxy im Spiel
//app.UseStaticFiles();

//app.UseRouting();

//app.UseAuthentication();     // erst Auth…
//app.UseAuthorization();      // …dann Authorization

//// 6) Endpoints
//app.MapControllers();        // /auth/login, /auth/logout, /auth/me
//app.MapBlazorHub();
//app.MapFallbackToPage("/_Host");

//app.Run();

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.EntityFrameworkCore;
using WerksverkaufScanner.Data;
using WerksverkaufScanner.Services;
// using System.Net; // nur nötig, wenn du KnownProxies/KnownNetworks setzt

var builder = WebApplication.CreateBuilder(args);

// --- WICHTIG FÜR IIS: KEIN eigenes HTTPS/UseUrls hier setzen! ---
// Kestrel lauscht hinter IIS nicht selbst auf :443. TLS terminiert im IIS.
Entfernt: builder.WebHost.UseUrls("https://0.0.0.0:3300");

// Optional (schadet nicht, macht die Absicht klar):
builder.WebHost.UseIIS();

// 1) ConnectionString prüfen
var cs = builder.Configuration.GetConnectionString("Default");
if (string.IsNullOrWhiteSpace(cs))
    throw new InvalidOperationException("ConnectionStrings:Default fehlt oder ist leer.");

// 2) Framework-Services
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddControllers();          // für AuthController (Login/Logout)
builder.Services.AddHttpClient();           // für Logout/Calls aus Layout/Login
builder.Services.AddHttpContextAccessor();  // falls Services HttpContext brauchen

// 3) Auth/Authorization (Cookie)
builder.Services
    .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(o =>
    {
        o.LoginPath = "/login";
        o.AccessDeniedPath = "/login";
        o.ReturnUrlParameter = "returnUrl";
        o.SlidingExpiration = true;
        o.ExpireTimeSpan = TimeSpan.FromHours(15); //somit AutoLogoff nach 15 Stunden

        // Cookie-Härtung:
        o.Cookie.Name = "Werksverkauf.Auth";
        o.Cookie.HttpOnly = true;
        // Hinter IIS wird über HTTPS ausgeliefert -> Always ist korrekt
        o.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        o.Cookie.SameSite = SameSiteMode.Lax;
    });
builder.Services.AddAuthorization();

// 4) App-Services & Datenzugriff
builder.Services.AddDbContextFactory<ScannerDb>(opt => opt.UseSqlServer(cs));
builder.Services.AddSingleton<StammdatenCache>();
builder.Services.AddScoped<InventurService>();
builder.Services.AddScoped<AuthService>();

// (Optional) Forwarded Headers – sinnvoll hinter IIS/Proxy
builder.Services.Configure<ForwardedHeadersOptions>(opt =>
{
    opt.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    // Falls du strikte Proxy-Liste willst:
    // opt.KnownProxies.Add(IPAddress.Parse("10.250.1.30"));
});

var app = builder.Build();

// 5) Middleware-Pipeline
app.UseForwardedHeaders();   // vor allem anderen, wenn Proxy im Spiel
app.UseHttpsRedirection();   // ok hinter IIS, nutzt X-Forwarded-Proto
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

// 6) Endpoints
app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

// --- Für lokalen Start (ohne IIS) z. B. auf HTTP-Port 3300 testen ---
// if (!app.Environment.IsProduction())
// {
//     app.Urls.Add("http://localhost:3300");
// }

app.Run();

