// i18n — tiny dot-path lookup + interpolation over the four dictionaries.
// Lives on `window` like every other module here (no build step, no bundler).
const SUPPORTED_LANGS = ['en', 'es', 'ca', 'nl'];
const LANG_STORAGE_KEY = 'agenda.lang.v1';

window.I18N_DICTS = { en: window.I18N_EN, es: window.I18N_ES, ca: window.I18N_CA, nl: window.I18N_NL };

function detectInitialLang() {
  try {
    const stored = localStorage.getItem(LANG_STORAGE_KEY);
    if (stored && SUPPORTED_LANGS.includes(stored)) return stored;
  } catch {}
  const nav = (navigator.language || 'en').slice(0, 2).toLowerCase();
  return SUPPORTED_LANGS.includes(nav) ? nav : 'en';
}

let currentLang = detectInitialLang();
const listeners = new Set();

function dictGet(dict, path) {
  return path.split('.').reduce((o, k) => (o && o[k] !== undefined ? o[k] : undefined), dict);
}

function t(path, vars) {
  const dict = window.I18N_DICTS[currentLang] || window.I18N_DICTS.en;
  let val = dictGet(dict, path);
  if (val === undefined) val = dictGet(window.I18N_DICTS.en, path);
  if (val === undefined) return path;
  if (typeof val !== 'string') return val;
  if (!vars) return val;
  return val.replace(/\{(\w+)\}/g, (m, k) => (vars[k] !== undefined ? String(vars[k]) : m));
}

function getLang() { return currentLang; }

function setLang(lang) {
  if (!SUPPORTED_LANGS.includes(lang)) return;
  currentLang = lang;
  try { localStorage.setItem(LANG_STORAGE_KEY, lang); } catch {}
  document.documentElement.lang = lang;
  listeners.forEach(fn => fn(lang));
}

function useI18n() {
  const [lang, setLangState] = React.useState(currentLang);
  React.useEffect(() => {
    const fn = (l) => setLangState(l);
    listeners.add(fn);
    return () => listeners.delete(fn);
  }, []);
  return { t, lang, setLang };
}

document.documentElement.lang = currentLang;

Object.assign(window, { t, setLang, getLang, useI18n, SUPPORTED_LANGS });
