import { NextResponse, type NextRequest } from "next/server";
import { locales, defaultLocale, isLocale, pickLocaleFromAcceptLanguage } from "@/lib/i18n/config";
import { updateSession } from "@/lib/supabase/middleware";

const PROTECTED_SEGMENTS = [
  "dashboard",
  "expenses",
  "budget",
  "goals",
  "subscriptions",
  "reports",
  "planning",
  "settings",
  "onboarding",
  "admin"
];

const AUTH_SEGMENTS = ["login", "register", "forgot-password", "reset-password"];

function getLocaleFromPath(pathname: string) {
  const segment = pathname.split("/")[1];
  return isLocale(segment) ? segment : null;
}

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

  // Skip static assets and API routes entirely.
  if (
    pathname.startsWith("/api") ||
    pathname.startsWith("/_next") ||
    pathname.match(/\.(.*)$/) // files with an extension (favicon.ico, etc.)
  ) {
    return NextResponse.next();
  }

  const pathLocale = getLocaleFromPath(pathname);

  // No locale in the URL yet -> detect and redirect once.
  if (!pathLocale) {
    const cookieLocale = request.cookies.get("tidyly-locale")?.value;
    const locale =
      cookieLocale && isLocale(cookieLocale)
        ? cookieLocale
        : pickLocaleFromAcceptLanguage(request.headers.get("accept-language"));

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

  // Refresh the Supabase session and get the current user for route guards.
  const { response, user } = await updateSession(request);

  const segments = pathname.split("/").filter(Boolean); // [locale, ...rest]
  const section = segments[1] ?? "";

  const isProtected = PROTECTED_SEGMENTS.includes(section);
  const isAuthPage = AUTH_SEGMENTS.includes(section);

  if (isProtected && !user) {
    const url = request.nextUrl.clone();
    url.pathname = `/${pathLocale}/login`;
    url.searchParams.set("redirect", pathname);
    return NextResponse.redirect(url);
  }

  if (isAuthPage && user) {
    const url = request.nextUrl.clone();
    url.pathname = `/${pathLocale}/dashboard`;
    return NextResponse.redirect(url);
  }

  // Persist the resolved locale so future visits without a path prefix
  // (e.g. a bookmarked "/") land on the right language.
  response.cookies.set("tidyly-locale", pathLocale, {
    path: "/",
    maxAge: 60 * 60 * 24 * 365
  });

  return response;
}

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

// Re-export for tests / clarity that only these locales are ever routed to.
export const supportedLocales = locales;
export const fallbackLocale = defaultLocale;
