import { cookies, headers } from "next/headers";

import {
  DEFAULT_LOCALE,
  LOCALE_COOKIE_NAME,
  normalizeSupportedLocale,
  resolveLocaleFromAcceptLanguage,
  resolveLocaleFromCountry,
  type SupportedLocale,
} from "@/lib/i18n-config";
import { getRequestCountryCode } from "@/lib/request-country";

export async function resolveRequestLocale(
  preferredLocale?: string | null,
): Promise<SupportedLocale> {
  const requestHeaders = await headers();
  const routedLocale = normalizeSupportedLocale(
    requestHeaders.get("x-official-locale"),
  );

  if (routedLocale) {
    return routedLocale;
  }

  const explicitPreference = normalizeSupportedLocale(preferredLocale);

  if (explicitPreference) {
    return explicitPreference;
  }

  const cookieStore = await cookies();
  const cookiePreference = normalizeSupportedLocale(
    cookieStore.get(LOCALE_COOKIE_NAME)?.value,
  );

  if (cookiePreference) {
    return cookiePreference;
  }

  const countryCode = getRequestCountryCode(requestHeaders);
  if (countryCode) {
    return resolveLocaleFromCountry(countryCode) ?? DEFAULT_LOCALE;
  }

  return resolveLocaleFromAcceptLanguage(requestHeaders.get("accept-language"));
}
