import type { GeoDeviceContext, LocalizationContext } from '../types.js';
import {
  resolveLocaleFromCountry,
  normalizeAcceptLanguage,
  getDefaultLocale,
} from './countryToLocale.js';

/**
 * Определяет locale на основе geo-контекста.
 * Приоритет: геопозиция > client.language > Accept-Language > fallback.
 * Геопозиция первая — если пользователь в России, показываем русский.
 */
export function resolveLocale(ctx: GeoDeviceContext | null): LocalizationContext {
  const fallback: LocalizationContext = {
    locale: getDefaultLocale(),
    language: getDefaultLocale(),
    region: null,
    countryCode: null,
    timezone: null,
    source: 'fallback',
  };

  if (!ctx) return fallback;

  const geo = ctx.geo;
  const acceptLang = normalizeAcceptLanguage(ctx.acceptLanguage);
  const clientLang = ctx.client?.language
    ? ctx.client.language.split('-')[0]?.toLowerCase()
    : null;

  // 1. Геопозиция (countryCode) — приоритет при определении по IP
  if (geo?.countryCode) {
    const locale = resolveLocaleFromCountry(geo.countryCode);
    return {
      locale,
      language: locale,
      region: geo.region ?? null,
      countryCode: geo.countryCode,
      timezone: geo.timezone ?? null,
      source: 'geo',
    };
  }

  // 2. Язык из client (браузер navigator.language)
  if (clientLang) {
    return {
      locale: clientLang,
      language: clientLang,
      region: geo?.region ?? null,
      countryCode: geo?.countryCode ?? null,
      timezone: geo?.timezone ?? null,
      source: 'client',
    };
  }

  // 3. Accept-Language заголовок
  if (acceptLang) {
    return {
      locale: acceptLang,
      language: acceptLang,
      region: geo?.region ?? null,
      countryCode: geo?.countryCode ?? null,
      timezone: geo?.timezone ?? null,
      source: 'accept-language',
    };
  }

  return fallback;
}
