import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import {
  defaultLocale,
  isLocale,
  localeCookieName,
  locales,
  type Locale,
} from "@/i18n/config";

function pickFromAcceptLanguage(header: string | null): Locale | null {
  if (!header) return null;
  const parts = header.split(",");
  for (const part of parts) {
    const code = part.trim().split(";")[0]?.toLowerCase().split("-")[0];
    if (code && isLocale(code)) return code;
  }
  return null;
}

function resolveLocale(request: NextRequest): Locale {
  const cookie = request.cookies.get(localeCookieName)?.value;
  if (cookie && isLocale(cookie)) return cookie;

  const fromHeader = pickFromAcceptLanguage(
    request.headers.get("accept-language"),
  );
  if (fromHeader) return fromHeader;

  return defaultLocale;
}

function withLocaleHeader(request: NextRequest, locale: Locale) {
  const requestHeaders = new Headers(request.headers);
  requestHeaders.set("x-locale", locale);
  return NextResponse.next({ request: { headers: requestHeaders } });
}

export function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;

  if (pathname.startsWith("/api")) {
    return NextResponse.next();
  }

  const first = pathname.split("/")[1];

  if (first && isLocale(first)) {
    const res = withLocaleHeader(request, first);
    res.cookies.set(localeCookieName, first, {
      path: "/",
      maxAge: 60 * 60 * 24 * 365,
      sameSite: "lax",
    });
    return res;
  }

  if (pathname === "/") {
    const locale = resolveLocale(request);
    return NextResponse.redirect(new URL(`/${locale}`, request.url));
  }

  const locale = resolveLocale(request);
  return withLocaleHeader(request, locale);
}

export const config = {
  matcher: [
    "/",
    "/((?!_next/static|_next/image|favicon.ico|.*\\..*).*)",
  ],
};
