import type { FunnelUserAnswers } from '@funnelsgrove/runtime'; const asTrimmedStringOrNull = (value: unknown): string | null => { if (typeof value !== 'string') { return null; } const trimmed = value.trim(); return trimmed || null; }; const readBrowserLocale = (): string | null => { if (typeof navigator === 'undefined') { return null; } return asTrimmedStringOrNull(navigator.language); }; const normalizeCountryCode = (countryCode: string | null): string | null => { if (!countryCode) { return null; } if (/^[a-z]{2}$/i.test(countryCode)) { return countryCode.toUpperCase(); } return countryCode; }; const getCountryFromLocale = (locale: string | null): string | null => { if (!locale) { return null; } const region = locale .split('-')[1] ?.trim() .toUpperCase(); return region && /^[A-Z]{2}$/.test(region) ? region : null; }; export function getStepContentLocale( attributes: FunnelUserAnswers, browserLocale: string | null = readBrowserLocale(), ): string | null { return ( asTrimmedStringOrNull(attributes.browserLanguage) || asTrimmedStringOrNull(attributes.language) || asTrimmedStringOrNull(attributes.locale) || asTrimmedStringOrNull(browserLocale) ); } export function getStepCountryCode( attributes: FunnelUserAnswers, locale: string | null = getStepContentLocale(attributes), ): string | null { const explicitCountry = asTrimmedStringOrNull(attributes.countryCode) || asTrimmedStringOrNull(attributes.country); return normalizeCountryCode(explicitCountry) || getCountryFromLocale(locale); }