import createMiddleware from "next-intl/middleware";
import { routing } from "./i18n/routing";
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

const intlMiddleware = createMiddleware(routing);

// Reicht den aktuellen Pfad als Request-Header durch, damit
// src/app/[locale]/layout.tsx (ein Server Component ohne eigenen Zugriff auf
// den Pfad) erkennen kann, ob gerade eine /admin-Seite gerendert wird, um dort
// die öffentliche Kopfzeile/Fußzeile auszublenden (Team-App-Look, siehe
// Kommentar dort). Läuft der next-intl-Middleware nach, damit deren
// Locale-Erkennung unverändert auf dem Original-Request arbeitet.
export default function proxy(request: NextRequest) {
  // /team lebt bewusst außerhalb von [locale] (Team-App-Login, kein
  // öffentlicher Bereich, kein DE/EN-Umschalten) — die next-intl-Middleware
  // würde sonst versuchen, einen Locale-Präfix davorzusetzen (→ /de/team/...,
  // eine Route, die es dort gar nicht gibt).
  if (request.nextUrl.pathname === "/team" || request.nextUrl.pathname.startsWith("/team/")) {
    return NextResponse.next();
  }

  const intlResponse = intlMiddleware(request);

  // Redirects (z. B. unpräfixierter Pfad → /de/...) einfach durchreichen —
  // in diesem Zyklus wird ohnehin keine Seite gerendert.
  if (intlResponse.status >= 300 && intlResponse.status < 400) return intlResponse;

  // next-intl reicht selbst schon einen Request-Header durch (die erkannte
  // Locale, über denselben x-middleware-override-headers/x-middleware-
  // request-*-Mechanismus, den wir für x-pathname brauchen). Erst dessen
  // bereits durchgereichte Header einsammeln und mit unserem zusammen in
  // EINEM NextResponse.next()-Aufruf setzen — ein zweiter, nachträglicher
  // Aufruf würde die override-headers-Liste von next-intl überschreiben und
  // deren Locale-Header stillschweigend verschlucken (der eigentliche Bug,
  // der x-pathname nie ankommen ließ).
  const forwardedNames = (intlResponse.headers.get("x-middleware-override-headers") || "")
    .split(",")
    .map((h) => h.trim())
    .filter(Boolean);

  const headers = new Headers(request.headers);
  for (const name of forwardedNames) {
    const value = intlResponse.headers.get(`x-middleware-request-${name}`);
    if (value != null) headers.set(name, value);
  }
  headers.set("x-pathname", request.nextUrl.pathname);

  const response = NextResponse.next({ request: { headers } });
  intlResponse.cookies.getAll().forEach((c) => response.cookies.set(c));
  intlResponse.headers.forEach((value, key) => {
    if (key === "x-middleware-override-headers" || key.startsWith("x-middleware-request-")) return;
    response.headers.set(key, value);
  });
  return response;
}

export const config = {
  // /admin läuft weiterhin mit durch die Locale-Middleware — nur die
  // öffentliche Seiten-Hülle (Header/Footer) wird für Mitarbeiter dort jetzt
  // separat im Layout ausgeblendet, siehe Kommentar oben.
  matcher: ["/((?!api|_next|_vercel|.*\\..*).*)"],
};
