import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { resolveRoute } from "@/config/routes";

export function proxy(request: NextRequest) {
  const { pathname, search } = request.nextUrl;

  // Ignore static assets, internal next routes, api endpoints, and media files
  if (
    pathname.startsWith("/_next") ||
    pathname.startsWith("/api") ||
    pathname.includes(".") ||
    pathname === "/favicon.ico" ||
    pathname === "/sitemap.xml" ||
    pathname === "/robots.txt"
  ) {
    return NextResponse.next();
  }

  const resolved = resolveRoute(pathname);
  const existingCookieLang = request.cookies.get("lang")?.value?.toLowerCase();
  const activeLang = existingCookieLang === "en" ? "en" : "fr";

  // Check if request is Next.js Client RSC payload navigation
  const isRsc =
    request.headers.get("rsc") === "1" ||
    request.headers.has("next-router-state-tree") ||
    search.includes("_rsc=");

  // 1. If user requested a French URL slug (e.g. /ophtalmologie/cataracte, /laser-yeux, /a-propos, /cliniques, /clinique-moleson-bulle)
  if (resolved.isFrenchUrl) {
    // If active language preference is "en" and distinct English slug exists, route to English version
    if (activeLang === "en" && resolved.frPath !== resolved.enPath) {
      if (isRsc) {
        const targetUrl = new URL(`${resolved.enPath}${search}`, request.url);
        const response = NextResponse.rewrite(targetUrl, {
          request: {
            headers: new Headers(request.headers),
          },
        });
        response.headers.set("x-locale", "en");
        response.headers.set("x-current-path", pathname);
        return response;
      }
      const redirectUrl = new URL(`${resolved.enPath}${search}`, request.url);
      return NextResponse.redirect(redirectUrl);
    }

    const targetUrl = new URL(`${resolved.enPath}${search}`, request.url);

    // Create internal rewrite to internal English page component
    const response = NextResponse.rewrite(targetUrl, {
      request: {
        headers: new Headers(request.headers),
      },
    });

    // Pass locale headers
    response.headers.set("x-locale", "fr");
    response.headers.set("x-current-path", pathname);

    if (existingCookieLang !== "fr") {
      response.cookies.set("lang", "fr", {
        path: "/",
        maxAge: 31536000,
        sameSite: "lax",
      });
    }

    return response;
  }

  // 2. If user requested an English URL slug that HAS a distinct French URL slug (e.g. /ophthalmology/cataract, /about-us, /clinics-and-doctors/buelle)
  // If active cookie language is "fr", redirect/rewrite to corresponding French URL slug
  if (activeLang === "fr" && resolved.frPath !== resolved.enPath) {
    if (isRsc) {
      const targetUrl = new URL(`${resolved.enPath}${search}`, request.url);
      const response = NextResponse.rewrite(targetUrl, {
        request: {
          headers: new Headers(request.headers),
        },
      });
      response.headers.set("x-locale", "fr");
      response.headers.set("x-current-path", pathname);
      return response;
    }

    const redirectUrl = new URL(`${resolved.frPath}${search}`, request.url);
    const response = NextResponse.redirect(redirectUrl);
    response.cookies.set("lang", "fr", {
      path: "/",
      maxAge: 31536000,
      sameSite: "lax",
    });
    return response;
  }

  // 3. Shared route (where enPath === frPath, e.g. "/", "/blogs", "/cookies") OR English route with activeLang === "en"
  const response = NextResponse.next();
  response.headers.set("x-locale", activeLang);
  response.headers.set("x-current-path", pathname);

  if (existingCookieLang !== activeLang) {
    response.cookies.set("lang", activeLang, {
      path: "/",
      maxAge: 31536000,
      sameSite: "lax",
    });
  }

  return response;
}

export default proxy;

export const config = {
  matcher: [
    /*
     * Match all request paths except for static files & favicon
     */
    "/((?!_next/static|_next/image|favicon.ico).*)",
  ],
};
