import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';

import es from './locales/es.json';
import en from './locales/en.json';
import ptBR from './locales/pt-BR.json';

// Recursos de tradução
const resources = {
  es: { translation: es },
  en: { translation: en },
  'pt-BR': { translation: ptBR },
};

// Mapeamento de países para idiomas
const countryToLanguage = {
  // Países que falam Espanhol
  ES: 'es', MX: 'es', AR: 'es', CO: 'es', CL: 'es', PE: 'es', VE: 'es',
  EC: 'es', GT: 'es', CU: 'es', BO: 'es', DO: 'es', HN: 'es', PY: 'es',
  SV: 'es', NI: 'es', CR: 'es', PA: 'es', UY: 'es', PR: 'es',
  
  // Países que falam Português
  BR: 'pt-BR', PT: 'pt-BR', AO: 'pt-BR', MZ: 'pt-BR',
};

// Função para detectar idioma por país (chamada assíncrona separada)
const detectLanguageByCountry = async () => {
  try {
    const savedLang = localStorage.getItem('i18nextLng');
    if (savedLang && ['es', 'en', 'pt-BR'].includes(savedLang)) {
      return null; // Já tem idioma salvo, não precisa detectar
    }
    
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 3000);
    
    const response = await fetch('https://ipapi.co/json/', { 
      signal: controller.signal 
    });
    clearTimeout(timeoutId);
    
    if (response.ok) {
      const data = await response.json();
      const countryCode = data.country_code;
      const detectedLang = countryToLanguage[countryCode] || 'en';
      
      console.log(`[i18n] País detectado: ${countryCode} (${data.country_name}) -> Idioma: ${detectedLang}`);
      return detectedLang;
    }
  } catch (error) {
    console.log('[i18n] Erro ao detectar país:', error.message);
  }
  return null;
};

// Configuração do i18next
i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
    resources,
    fallbackLng: 'en',
    supportedLngs: ['es', 'en', 'pt-BR'],
    
    interpolation: {
      escapeValue: false,
    },

    detection: {
      order: ['localStorage', 'navigator'],
      lookupLocalStorage: 'i18nextLng',
      caches: ['localStorage'],
    },

    react: {
      useSuspense: true,
    },
  });

// Detectar idioma por país após inicialização (se não tiver no localStorage)
const savedLang = localStorage.getItem('i18nextLng');
if (!savedLang) {
  detectLanguageByCountry().then((detectedLang) => {
    if (detectedLang && detectedLang !== i18n.language) {
      console.log(`[i18n] Mudando idioma para: ${detectedLang}`);
      i18n.changeLanguage(detectedLang);
      localStorage.setItem('i18nextLng', detectedLang);
    }
  });
}

export default i18n;

// Lista de idiomas disponíveis para seletor
export const availableLanguages = [
  { code: 'es', name: 'Español', flag: '🇪🇸' },
  { code: 'en', name: 'English', flag: '🇺🇸' },
  { code: 'pt-BR', name: 'Português (BR)', flag: '🇧🇷' },
];

// Função helper para mudar idioma
export const changeLanguage = (langCode) => {
  i18n.changeLanguage(langCode);
  localStorage.setItem('i18nextLng', langCode);
};

// Função helper para obter idioma atual
export const getCurrentLanguage = () => {
  return i18n.language || 'es';
};
