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

const locales = ["en", "hi", "gu"] as const;
type Locale = (typeof locales)[number];

const legacyProductRoutes: Record<string, string> = {
  "/register": "/products/pureestate/register",
  "/signup": "/products/pureestate/register",
  "/builderpro": "/products/buildpro",
  "/buildpro": "/products/buildpro",
  "/builderprologin": "/products/buildpro/login",
  "/buildprologin": "/products/buildpro/login",
  "/buildersignup": "/products/buildpro/register",
  "/buildprosignup": "/products/buildpro/register",
  "/societypro": "/products/societypro",
  "/societysignup": "/products/societypro/register",
};

function detectLocale(request: NextRequest): Locale {
  const savedLocale = request.cookies.get("puresaas-locale")?.value;
  if (locales.includes(savedLocale as Locale)) return savedLocale as Locale;

  const acceptedLanguages = request.headers
    .get("accept-language")
    ?.split(",")
    .map((item) => item.trim().split(";")[0]?.toLowerCase());

  for (const language of acceptedLanguages ?? []) {
    const locale = locales.find((item) => language === item || language?.startsWith(`${item}-`));
    if (locale) return locale;
  }

  return "en";
}

export function proxy(request: NextRequest) {
  const { pathname } = request.nextUrl;
  const segments = pathname.split("/").filter(Boolean);
  const pathLocale = locales.includes(segments[0] as Locale) ? (segments[0] as Locale) : null;
  const legacyPath = `/${segments.slice(pathLocale ? 1 : 0).join("/")}`;
  const legacyDestination = legacyProductRoutes[legacyPath];

  if (legacyDestination) {
    request.nextUrl.pathname = `/${pathLocale ?? detectLocale(request)}${legacyDestination}`;
    return NextResponse.redirect(request.nextUrl);
  }

  const pathnameHasLocale = locales.some(
    (locale) => pathname === `/${locale}` || pathname.startsWith(`/${locale}/`),
  );

  if (pathnameHasLocale) return NextResponse.next();

  const locale = detectLocale(request);
  request.nextUrl.pathname = `/${locale}${pathname === "/" ? "" : pathname}`;
  return NextResponse.redirect(request.nextUrl);
}

export const config = {
  matcher: [
    "/",
    "/((?!api|_next/static|_next/image|favicon.ico|opengraph-image|robots.txt|sitemap.xml|manifest.webmanifest|.*\\..*).*)",
  ],
};
