using foodmarket.Application.Common.Tenancy;

namespace foodmarket.Api.Infrastructure.Tenancy;

/// <summary>Когда SuperAdmin прислал X-Org-Override — режим «открыть как…»
/// должен быть строго read-only (Phase 2). Любая мутация (PUT/POST/DELETE/PATCH)
/// на любой endpoint, кроме самих /api/super-admin/* (управление орг)
/// и /api/auth/* (refresh tokens) — отбивается 403 с понятным сообщением.
/// Phase 3 (edit-mode с reason + audit-trail) будет ослаблять ограничение.</summary>
public class ReadonlyOverrideMiddleware
{
    private readonly RequestDelegate _next;
    public ReadonlyOverrideMiddleware(RequestDelegate next) => _next = next;

    public async Task InvokeAsync(HttpContext ctx)
    {
        if (!ctx.Request.Headers.ContainsKey(HttpContextTenantContext.OrgOverrideHeader))
        {
            await _next(ctx); return;
        }
        var method = ctx.Request.Method.ToUpperInvariant();
        if (method == "GET" || method == "HEAD" || method == "OPTIONS")
        {
            await _next(ctx); return;
        }
        var path = ctx.Request.Path.Value ?? "";
        if (path.StartsWith("/api/super-admin/", StringComparison.OrdinalIgnoreCase)
            || path.StartsWith("/connect/", StringComparison.OrdinalIgnoreCase))
        {
            await _next(ctx); return;
        }
        // Phase 3: edit-mode — SuperAdmin прислал X-Org-Override-Reason ≥ 10
        // символов, мутации пропускаем. Запись в audit-log делает Pipeline-
        // фильтр (см. SuperAdminEditAuditFilter) после успешного ответа.
        if (ctx.Request.Headers.TryGetValue(HttpContextTenantContext.EditReasonHeader, out var reason)
            && (reason.ToString() ?? "").Trim().Length >= 10)
        {
            await _next(ctx); return;
        }
        ctx.Response.StatusCode = StatusCodes.Status403Forbidden;
        await ctx.Response.WriteAsJsonAsync(new
        {
            error = "Read-only mode: вы в режиме «Супер-админ → открыть как…», мутации запрещены. Включите edit-mode с указанием причины или выйдите из режима.",
        });
    }
}
