import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { auth } from "@/auth";

// =====================================================================
// Kita-Planer · Proxy (ehem. Middleware, seit Next.js 16 umbenannt)
// ---------------------------------------------------------------------
// Optimistischer Guard — prüft den JWT-Cookie direkt, ohne DB-Call.
// Der sichere DB-seitige Check (Consent, Rolle) findet in den
// jeweiligen Server Components via `requireKitaSession()` statt.
//
// Routing-Logik:
//   Nicht eingeloggt + geschützte Route        → /login
//   Eingeloggt + kein kitaId + nicht /onboarding → /onboarding
//   Eingeloggt + SUPERADMIN                  → /admin
//   Eingeloggt + hat kitaId  + auf /onboarding  → /dashboard
//   Eingeloggt + auf /login oder /register      → Post-Login-Ziel
// =====================================================================

const ONBOARDING_ROUTE = "/onboarding";
const PROTECTED_PREFIX = ["/dashboard", "/admin", "/onboarding"];
const PUBLIC_PATHS = new Set(["/", "/impressum", "/datenschutz"]);
const PUBLIC_PREFIX = ["/features"];

function getPostLoginPath(user: { role?: string; kitaId?: string | null }) {
  if (user.role === "SUPERADMIN") {
    return "/admin";
  }

  return user.kitaId ? "/dashboard" : ONBOARDING_ROUTE;
}

export async function proxy(request: NextRequest) {
  const { pathname } = request.nextUrl;
  const isPublicRoute =
    PUBLIC_PATHS.has(pathname) ||
    PUBLIC_PREFIX.some((prefix) => pathname.startsWith(prefix));

  if (isPublicRoute) {
    return NextResponse.next();
  }

  // Auth.js liest den Session-JWT aus dem Cookie —
  // kein DB-Call, pure Token-Verifikation (Edge-sicher).
  const session = await auth();
  const user = session?.user;
  const hasValidUser = !!user?.id;

  const isProtectedRoute = PROTECTED_PREFIX.some((prefix) =>
    pathname.startsWith(prefix),
  );

  // ── 1. Nicht eingeloggt + geschützte Route ──────────────────────────
  if (!hasValidUser && isProtectedRoute) {
    const loginUrl = new URL("/login", request.nextUrl);
    // callbackUrl für spätere Nutzung (optional)
    loginUrl.searchParams.set("callbackUrl", pathname);
    return NextResponse.redirect(loginUrl);
  }

  // ── 2. Eingeloggt ───────────────────────────────────────────────────
  if (hasValidUser && user) {
    // 2a. Eingeloggter User auf Login/Register-Seite → direkt zum Ziel,
    //     damit die öffentliche Startseite stabil indexierbar bleibt.
    if (pathname === "/login" || pathname === "/register") {
      return NextResponse.redirect(
        new URL(getPostLoginPath(user), request.nextUrl),
      );
    }

    if (user.role === "SUPERADMIN" && pathname === ONBOARDING_ROUTE) {
      return NextResponse.redirect(new URL("/admin", request.nextUrl));
    }

    // 2b. Kein kitaId (heimatloser Admin) → muss Onboarding abschließen.
    //     Ausnahme: Superadmin hat nie eine kitaId.
    if (
      !user.kitaId &&
      user.role !== "SUPERADMIN" &&
      isProtectedRoute &&
      !pathname.startsWith(ONBOARDING_ROUTE)
    ) {
      return NextResponse.redirect(new URL(ONBOARDING_ROUTE, request.nextUrl));
    }

    // 2c. Hat kitaId und will /onboarding aufrufen → direkt ins Dashboard.
    if (user.kitaId && pathname.startsWith(ONBOARDING_ROUTE)) {
      return NextResponse.redirect(new URL("/dashboard", request.nextUrl));
    }
  }

  return NextResponse.next();
}

// Proxy auf alle sinnvollen Routen anwenden; statische Dateien,
// API-Routen und Next.js-interne Routen ausschließen.
export const config = {
  matcher: [
    "/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)",
  ],
};
