/* global React */
// ─────────────────────────────────────────────────────────────────────────
// i18n: PT / EN / ES translations + region-aware labels (postal, currency)
// ─────────────────────────────────────────────────────────────────────────

const SUPPORTED = ['pt', 'en', 'es'];
const LOCALE_KEY = 'vermeip:locale';

// Currency profiles (location-driven, not language-driven)
const REGIONS = {
  BRL: {
    currency: 'BRL', symbol: 'R$',
    postal:    { pt: 'CEP',     en: 'CEP',     es: 'CEP' },
    vpnPrice:  { pt: '14,90',   en: '14.90',   es: '14,90' },
    vpnPeriod: { pt: 'mês',     en: 'month',   es: 'mes' },
  },
  EUR: {
    currency: 'EUR', symbol: '€',
    postal:    { pt: 'Código Postal', en: 'Postal Code', es: 'Código Postal' },
    vpnPrice:  { pt: '4,99',  en: '4.99',  es: '4,99' },
    vpnPeriod: { pt: 'mês',   en: 'month', es: 'mes' },
  },
  GBP: {
    currency: 'GBP', symbol: '£',
    postal:    { pt: 'Código Postal', en: 'Postcode',    es: 'Código Postal' },
    vpnPrice:  { pt: '3,99',  en: '3.99',  es: '3,99' },
    vpnPeriod: { pt: 'mês',   en: 'month', es: 'mes' },
  },
  USD: {
    currency: 'USD', symbol: '$',
    postal:    { pt: 'CEP',  en: 'ZIP Code',     es: 'Código Postal' },
    vpnPrice:  { pt: '5,99', en: '5.99',         es: '5,99' },
    vpnPeriod: { pt: 'mês',  en: 'month',        es: 'mes' },
  },
};

// Country code → currency profile
const EUR_COUNTRIES = new Set([
  'AT','BE','CY','DE','EE','ES','FI','FR','GR','HR','IE','IT',
  'LT','LU','LV','MT','NL','PT','SI','SK',
  // Euro-using non-EU territories
  'AD','MC','SM','VA','XK','ME',
]);
const GBP_COUNTRIES = new Set(['GB','UK','GG','IM','JE']);
// Everything else defaults to USD ($) — covers US, Canada (CAD≈$), AU, NZ, JP, MX, AR, CL, CO, PE, etc.

function getRegion(countryCode) {
  if (!countryCode) return REGIONS.USD;
  const cc = countryCode.toUpperCase();
  if (cc === 'BR')          return REGIONS.BRL;
  if (GBP_COUNTRIES.has(cc)) return REGIONS.GBP;
  if (EUR_COUNTRIES.has(cc)) return REGIONS.EUR;
  return REGIONS.USD;
}

// ── Translations ──────────────────────────────────────────────────────────
const LOCALES = {
  pt: {
    htmlLang: 'pt-BR',
    nav: { home: 'Meu IP', dns: 'DNS Lookup', ping: 'Ping', whois: 'WHOIS', speed: 'Velocidade', reverse: 'DNS Reverso', menu: 'Menu' },
    theme: { light: 'Modo claro', dark: 'Modo escuro' },
    lang:  { label: 'Idioma', pt: 'Português', en: 'English', es: 'Español' },
    common: { copy: 'Copiar', loading: 'Carregando…', empty: '—' },
    home: {
      eyebrow: 'Ver meu IP',
      titleA: 'Seu endereço IP, em ', titleHi: 'tempo real', titleZ: '.',
      lede: 'Detectamos automaticamente seu IPv4, IPv6, localização aproximada, provedor e fuso horário. Tudo direto do seu navegador.',
    },
    ipCard: {
      label: 'Seu endereço público', connected: 'Conectado',
      city: 'Cidade', state: 'Estado', country: 'País',
      timezone: 'Fuso horário', asn: 'ASN', isp: 'Provedor (ISP)', hostname: 'Hostname',
    },
    qt: {
      dns:    { t: 'DNS Lookup',  s: 'Registros A, AAAA, MX, TXT' },
      ping:   { t: 'Ping',        s: 'Teste a latência de um site' },
      whois:  { t: 'WHOIS',       s: 'Quem registrou um domínio' },
      speed:  { t: 'Velocidade',  s: 'Download e upload' },
      reverse:{ t: 'DNS Reverso', s: 'IP → hostname' },
      myip:   { t: 'Meu IP',      s: 'Detectar automaticamente' },
    },
    vpn: {
      tag:   'Patrocinado · link de afiliado',
      title: 'Esconda seu IP com a NordVPN',
      desc:  'Criptografia AES-256, servidores em todo o mundo. A partir de {sym} {price}/{period}.',
      cta:   'Ver oferta',
      mTitle:'Proteja sua conexão', mDesc: 'VPN com servidores em todo o mundo', mCta: 'Experimentar grátis',
    },
    history: {
      title: 'Histórico recente',
      empty: 'Suas últimas consultas aparecerão aqui. Nada é enviado ao servidor — fica salvo apenas neste navegador.',
      clear: 'Limpar',
    },
    faq: {
      eyebrow: 'Perguntas frequentes',
      title: 'Aprenda sobre endereços IP',
      sub: 'Conceitos essenciais explicados sem jargão desnecessário.',
      items: [
        { q: 'O que é um endereço IP?', a: 'Um endereço IP (Internet Protocol) é um identificador único atribuído ao seu dispositivo na internet. Funciona como um endereço postal para sua conexão.' },
        { q: 'Qual a diferença entre IPv4 e IPv6?', a: 'IPv4 usa 4 grupos de números (ex.: 187.32.144.218) com cerca de 4,3 bilhões de endereços. IPv6 usa 8 grupos hexadecimais e oferece um número virtualmente infinito de endereços, sendo o padrão moderno.' },
        { q: 'Por que minha localização aparece um pouco diferente?', a: 'A geolocalização por IP usa bancos de dados que mapeiam blocos de IP para regiões aproximadas. Acerta a cidade, mas pode mostrar o data center do provedor. Para localização precisa, é necessário GPS.' },
        { q: 'É seguro mostrar meu IP?', a: 'Seu IP público já é visível para qualquer site que você acessa. Por si só, não revela seu nome nem endereço físico — mas combinado com cookies e logs do provedor, pode ser usado para te rastrear. Uma VPN ajuda a mascará-lo.' },
        { q: 'O que é uma VPN e quando devo usar?', a: 'Uma VPN cria um túnel criptografado entre você e um servidor remoto, fazendo sites verem o IP do servidor em vez do seu. Útil em Wi-Fi públicos, conteúdo regional e privacidade.' },
        { q: 'Os dados ficam salvos no Ver meu IP?', a: 'Não. Detectamos seu IP no momento que você acessa para mostrar na tela, mas não armazenamos. O histórico fica apenas no seu navegador (localStorage).' },
      ],
    },
    adblock: {
      title: 'Bloqueador de anúncios detectado',
      desc:  'Detectamos que você está usando um bloqueador de anúncios. O <strong>Ver meu IP</strong> é 100% gratuito e depende da receita de anúncios para cobrir os custos de servidor. Por favor, desative seu bloqueador para ajudar a manter o site gratuito.',
      btn1:  'Como desativar o bloqueador',
      btn2:  'Entendo, mas vou manter ativado',
    },
    rateLimit: {
      title: 'Limite de verificações atingido',
      desc:  'Para proteger nossa infraestrutura, permitimos no máximo <strong>4 verificações de IP a cada 12 horas</strong>. Sua cota será renovada em:',
      vpnHint: 'Usando uma VPN? Seu IP pode mudar e os limites se renovam automaticamente por endereço.',
      vpnCta:  'Obter VPN — oculte seu IP',
    },
    cookies: {
      bigText: '🍪 Este site usa cookies.',
      desc:    'Usamos cookies próprios e de terceiros (Google Analytics, AdSense) para melhorar sua experiência, analisar o tráfego e exibir anúncios. Ao continuar a navegar, você concorda com nossa',
      policyLink:  'Política de Cookies',
      privacyLink: 'Política de Privacidade',
      and:    'e',
      learn:  'Saber mais',
      accept: 'Aceitar',
    },
    footer: {
      tagline: 'Ferramentas gratuitas de rede. Descubra seu IP, consulte DNS, faça ping em sites e mais — tudo direto do navegador.',
      tools: 'Ferramentas', learn: 'Aprenda', about: 'Sobre',
      whatIp: 'O que é IP?', v4v6: 'IPv4 vs IPv6', privacy: 'Privacidade', glossary: 'Glossário',
      contact: 'Contato', privacyPolicy: 'Política de Privacidade', terms: 'Termos de Uso',
      copyright: '© {year} Ver meu IP', disclaimer: 'Os dados exibidos são exemplos para fins de demonstração.',
    },
    tools: {
      eyebrow: 'Ferramenta', tipsTitle: 'Dicas',
      btn: { go: 'Consultar', loading: 'Consultando…' },
      dns: {
        title: 'Consulta DNS',
        lede:  'Veja quais servidores um domínio aponta. Suporta registros A, AAAA, MX, TXT, NS e CNAME.',
        domainLabel: 'Domínio', placeholder: 'exemplo.com.br',
        results: 'Resultados', count: '{n} registros', countOne: '{n} registro',
        empty: 'Nenhum registro {type} encontrado para este domínio.',
        thType: 'Tipo', thName: 'Nome', thValue: 'Valor', thTtl: 'TTL',
        tips: [
          'Registros A apontam para IPv4; AAAA para IPv6.',
          'MX define os servidores de e-mail.',
          'TXT é usado para SPF, DKIM e verificação de domínio.',
          'Mudanças de DNS podem levar até 48h para propagar.',
        ],
      },
      ping: {
        title: 'Teste o seu site (Ping)',
        lede:  'Mede a latência até qualquer servidor — exatamente como o comando ping no terminal, mas direto no navegador.',
        hostLabel: 'Host ou IP', placeholder: 'exemplo.com.br',
        start: 'Iniciar ping', stop: 'Parar',
        ready: 'Pronto. Pressione "Iniciar ping" para começar.',
        running: 'em execução',
        statsTitle: 'Resumo estatístico',
        min: 'Mín.', avg: 'Médio', max: 'Máx.', loss: 'Perda',
        meaning: 'O que isso significa?',
        latencyRef: 'Referências de latência',
        ranges: [
          { range: '< 30 ms',   use: 'Jogos competitivos' },
          { range: '30–60 ms',  use: 'Streaming · chamadas' },
          { range: '60–150 ms', use: 'Navegação geral' },
          { range: '> 150 ms',  use: 'Servidor distante' },
        ],
        tips: [
          'Latência abaixo de 50ms é excelente para a maioria das aplicações.',
          'Perda de pacotes acima de 1% indica problema de rede.',
          'Use IP em vez de domínio para isolar problemas de DNS.',
          'ICMP pode ser bloqueado por alguns firewalls.',
        ],
        latTier: {
          excellent: ['Excelente', 'Latência ótima — ideal para jogos online competitivos, chamadas de vídeo e qualquer aplicação em tempo real.'],
          veryGood:  ['Muito boa', 'Boa latência para a maioria dos usos: streaming, chamadas, jogos casuais e navegação fluida.'],
          ok:        ['Aceitável', 'Funciona bem para navegação e streaming, mas pode haver pequeno atraso em jogos rápidos e videochamadas.'],
          high:      ['Alta', 'Você pode notar lentidão em chamadas e jogos. Aceitável para navegação e e-mail.'],
          veryHigh:  ['Muito alta', 'Há atraso perceptível. Verifique sua conexão, distância do servidor ou se há outra rota disponível.'],
        },
        jitTier: {
          stable:    ['Estável', 'Conexão muito consistente, sem variação significativa entre pacotes.'],
          slightly:  ['Levemente instável', 'Pequenas variações no tempo de resposta — normal em redes Wi-Fi.'],
          unstable:  ['Instável', 'Variação alta entre pacotes (jitter). Pode causar engasgos em chamadas e streaming.'],
        },
        lossTier: {
          none: ['Sem perdas', 'Todos os pacotes chegaram. Conexão íntegra.'],
          min:  ['Perda mínima', 'Perda muito baixa — geralmente imperceptível.'],
          mod:  ['Perda moderada', 'Pode causar travamentos ocasionais em chamadas e jogos.'],
          high: ['Perda alta', 'Algo está bloqueando ou descartando pacotes. Verifique cabos, Wi-Fi e firewall.'],
        },
        overall: {
          problems: ['Conexão com problemas', 'Os resultados para {host} indicam algo a investigar. Veja os detalhes abaixo.'],
          okay:     ['Conexão razoável',     'Você consegue usar {host} normalmente, mas há margem para melhoria.'],
          healthy:  ['Conexão saudável',      '{host} está respondendo bem — sem indícios de problema.'],
        },
        verdictH: {
          lat:  'Latência média — {label} ({avg} ms)',
          jit:  'Estabilidade — {label} (jitter {mdev} ms)',
          loss: 'Perda de pacotes — {label} ({loss}%)',
        },
      },
      whois: {
        title: 'WHOIS',
        lede:  'Descubra quem registrou um domínio, quando, em qual registrar e quando expira.',
        domainLabel: 'Domínio', placeholder: 'exemplo.com.br',
        domain: 'Domínio',
        expiresIn: 'expira em {days} dias',
        rawTitle: 'Resposta WHOIS bruta',
        tips: [
          'Domínios .br são registrados via Registro.br.',
          'Muitos registrars oferecem privacidade WHOIS — os dados pessoais ficam ocultos.',
          'Renove com antecedência para não perder o domínio.',
        ],
      },
      speed: {
        title: 'Teste de velocidade',
        lede:  'Mede sua velocidade de download, upload e a latência da sua conexão. Demonstrativo — em produção usaria servidores reais.',
        ping: 'Ping', download: 'Download', upload: 'Upload',
        start: 'Iniciar teste', again: 'Testar de novo',
        measuring: 'Medindo {phase}…',
        labels: { ping: 'PING', download: 'DOWNLOAD', upload: 'UPLOAD' },
        serverTitle: 'Servidor de teste',
        distance: '{ms}ms de distância',
        tips: [
          'Conecte o cabo ou fique perto do roteador para medir o limite real do link.',
          'Feche apps que usam internet (streaming, backups) antes de testar.',
          'Velocidades entre 25–300 Mbps são típicas em planos de fibra residenciais.',
        ],
      },
      reverse: {
        title: 'DNS Reverso',
        lede:  'Descubra qual hostname está associado a um endereço IP — útil para identificar provedores e diagnosticar e-mails.',
        ipLabel: 'Endereço IP', placeholder: '8.8.8.8',
        ipTitle: 'IP consultado', ptrTitle: 'Hostname (PTR)',
        valid: 'FCrDNS válido', invalid: 'FCrDNS inválido',
        tips: [
          'Servidores de e-mail confiáveis exigem rDNS configurado.',
          'Nem todo IP tem registro PTR — alguns provedores residenciais não configuram.',
          'Confirme com forward-confirmed reverse DNS (FCrDNS) para validação completa.',
        ],
      },
      adSlot: 'Espaço para anúncio',
      adMobile: 'Espaço para anúncio · 320×100 (mobile)',
      adLeader: 'Espaço para anúncio · 728×90 (leaderboard)',
    },
    legal: { eyebrow: 'Legal', updated: 'Última atualização: {date}', toc: 'Índice' },
    seo: {
      home:        { title: 'Ver meu IP — Qual é o meu endereço IP? Ferramentas de Rede Grátis', desc: 'Descubra seu endereço IP público (IPv4 e IPv6) e localização. DNS Lookup, Ping, WHOIS, teste de velocidade e DNS reverso — gratuito, em português.' },
      dns:         { title: 'Consulta DNS — Ver meu IP',         desc: 'Consulte registros DNS A, AAAA, MX, TXT, NS, CNAME e SOA de qualquer domínio em tempo real.' },
      ping:        { title: 'Ping / Teste o seu site — Ver meu IP', desc: 'Teste a latência até qualquer servidor direto do navegador. Estatísticas detalhadas e interpretação dos resultados.' },
      whois:       { title: 'WHOIS — Ver meu IP',                desc: 'Descubra quem registrou um domínio, registrar, datas de criação e expiração, nameservers — incluindo .br via Registro.br.' },
      speed:       { title: 'Teste de Velocidade — Ver meu IP',  desc: 'Meça a velocidade de download, upload e a latência da sua conexão.' },
      reverse:     { title: 'DNS Reverso — Ver meu IP',          desc: 'Consulte o hostname (PTR) associado a um IP, com validação FCrDNS.' },
      privacidade: { title: 'Política de Privacidade — Ver meu IP', desc: 'Como tratamos seus dados em conformidade com a LGPD e o RGPD/GDPR.' },
      termos:      { title: 'Termos de Uso — Ver meu IP',        desc: 'Termos de uso, limites e responsabilidades do serviço Ver meu IP.' },
    },
  },

  en: {
    htmlLang: 'en',
    nav: { home: 'My IP', dns: 'DNS Lookup', ping: 'Ping', whois: 'WHOIS', speed: 'Speed', reverse: 'Reverse DNS', menu: 'Menu' },
    theme: { light: 'Light mode', dark: 'Dark mode' },
    lang:  { label: 'Language', pt: 'Português', en: 'English', es: 'Español' },
    common: { copy: 'Copy', loading: 'Loading…', empty: '—' },
    home: {
      eyebrow: 'Check My IP',
      titleA: 'Your IP address, in ', titleHi: 'real time', titleZ: '.',
      lede: 'We automatically detect your IPv4, IPv6, approximate location, ISP and timezone. All directly from your browser.',
    },
    ipCard: {
      label: 'Your public address', connected: 'Connected',
      city: 'City', state: 'State', country: 'Country',
      timezone: 'Timezone', asn: 'ASN', isp: 'ISP', hostname: 'Hostname',
    },
    qt: {
      dns:    { t: 'DNS Lookup',   s: 'A, AAAA, MX, TXT records' },
      ping:   { t: 'Ping',         s: 'Test website latency' },
      whois:  { t: 'WHOIS',        s: 'Who registered a domain' },
      speed:  { t: 'Speed',        s: 'Download and upload' },
      reverse:{ t: 'Reverse DNS',  s: 'IP → hostname' },
      myip:   { t: 'My IP',        s: 'Auto-detect' },
    },
    vpn: {
      tag:   'Sponsored · affiliate link',
      title: 'Hide your IP with NordVPN',
      desc:  'AES-256 encryption, servers all around the world. From {sym}{price}/{period}.',
      cta:   'See offer',
      mTitle:'Protect your connection', mDesc: 'VPN with servers all around the world', mCta: 'Try free',
    },
    history: {
      title: 'Recent history',
      empty: 'Your latest queries will appear here. Nothing is sent to the server — saved only in this browser.',
      clear: 'Clear',
    },
    faq: {
      eyebrow: 'FAQ',
      title: 'Learn about IP addresses',
      sub: 'Essential concepts explained without unnecessary jargon.',
      items: [
        { q: 'What is an IP address?', a: 'An IP (Internet Protocol) address is a unique identifier assigned to your device on the internet. It works like a postal address for your connection.' },
        { q: 'What is the difference between IPv4 and IPv6?', a: 'IPv4 uses 4 groups of numbers (e.g. 187.32.144.218) with about 4.3 billion possible addresses. IPv6 uses 8 hexadecimal groups, providing a virtually infinite number of addresses — the modern standard.' },
        { q: 'Why does my location appear slightly different?', a: 'IP geolocation uses databases mapping IP blocks to approximate regions. It usually gets the city right, but may show the ISP\'s data center instead of your home. For precise location, GPS is required.' },
        { q: 'Is it safe to show my IP?', a: 'Your public IP is already visible to any site you visit. By itself, it doesn\'t reveal your name or physical address — but combined with cookies and ISP logs, it can be used for tracking. A VPN helps mask it.' },
        { q: 'What is a VPN and when should I use it?', a: 'A VPN creates an encrypted tunnel between you and a remote server, so sites see the server\'s IP instead of yours. Useful on public Wi-Fi, for regional content and privacy.' },
        { q: 'Does Ver meu IP store my data?', a: 'No. We detect your IP at access time to display it, but we don\'t store it. The query history shown on this page lives only in your browser (localStorage).' },
      ],
    },
    adblock: {
      title: 'Ad blocker detected',
      desc:  'We\'ve detected that you\'re using an ad blocker. <strong>Ver meu IP</strong> is 100% free and relies on ad revenue to cover server costs. Please disable your ad blocker to help keep the site free.',
      btn1:  'How to disable the blocker',
      btn2:  'I understand, but I\'ll keep it on',
    },
    rateLimit: {
      title: 'IP check limit reached',
      desc:  'To protect our infrastructure, we allow at most <strong>4 IP checks every 12 hours</strong>. Your quota will renew in:',
      vpnHint: 'Using a VPN? Your IP may change and limits renew automatically per address.',
      vpnCta:  'Get a VPN — hide your IP',
    },
    cookies: {
      bigText: '🍪 This site uses cookies.',
      desc:    'We use first- and third-party cookies (Google Analytics, AdSense) to improve your experience, analyze traffic and display ads. By continuing to browse, you agree to our',
      policyLink:  'Cookie Policy',
      privacyLink: 'Privacy Policy',
      and:    'and',
      learn:  'Learn more',
      accept: 'Accept',
    },
    footer: {
      tagline: 'Free network tools. Find your IP, look up DNS, ping sites and more — all from your browser.',
      tools: 'Tools', learn: 'Learn', about: 'About',
      whatIp: 'What is an IP?', v4v6: 'IPv4 vs IPv6', privacy: 'Privacy', glossary: 'Glossary',
      contact: 'Contact', privacyPolicy: 'Privacy Policy', terms: 'Terms of Use',
      copyright: '© {year} Ver meu IP', disclaimer: 'Displayed data is for demonstration purposes.',
    },
    tools: {
      eyebrow: 'Tool', tipsTitle: 'Tips',
      btn: { go: 'Look up', loading: 'Looking up…' },
      dns: {
        title: 'DNS Lookup',
        lede:  'See which servers a domain points to. Supports A, AAAA, MX, TXT, NS and CNAME records.',
        domainLabel: 'Domain', placeholder: 'example.com',
        results: 'Results', count: '{n} records', countOne: '{n} record',
        empty: 'No {type} records found for this domain.',
        thType: 'Type', thName: 'Name', thValue: 'Value', thTtl: 'TTL',
        tips: [
          'A records point to IPv4; AAAA to IPv6.',
          'MX defines mail servers.',
          'TXT is used for SPF, DKIM and domain verification.',
          'DNS changes can take up to 48h to propagate.',
        ],
      },
      ping: {
        title: 'Test your site (Ping)',
        lede:  'Measures latency to any server — exactly like the ping command in your terminal, but directly in the browser.',
        hostLabel: 'Host or IP', placeholder: 'example.com',
        start: 'Start ping', stop: 'Stop',
        ready: 'Ready. Press "Start ping" to begin.',
        running: 'running',
        statsTitle: 'Statistics summary',
        min: 'Min.', avg: 'Avg.', max: 'Max.', loss: 'Loss',
        meaning: 'What does this mean?',
        latencyRef: 'Latency reference',
        ranges: [
          { range: '< 30 ms',   use: 'Competitive gaming' },
          { range: '30–60 ms',  use: 'Streaming · calls' },
          { range: '60–150 ms', use: 'General browsing' },
          { range: '> 150 ms',  use: 'Distant server' },
        ],
        tips: [
          'Latency below 50ms is excellent for most apps.',
          'Packet loss above 1% indicates a network issue.',
          'Use IP instead of domain to isolate DNS problems.',
          'ICMP can be blocked by some firewalls.',
        ],
        latTier: {
          excellent: ['Excellent', 'Optimal latency — ideal for competitive online gaming, video calls and any real-time application.'],
          veryGood:  ['Very good', 'Great latency for most uses: streaming, calls, casual gaming and smooth browsing.'],
          ok:        ['Acceptable', 'Works well for browsing and streaming, but you may notice slight delay in fast games and video calls.'],
          high:      ['High', 'You may notice lag in calls and games. Acceptable for browsing and email.'],
          veryHigh:  ['Very high', 'Noticeable delay. Check your connection, server distance, or look for an alternative route.'],
        },
        jitTier: {
          stable:    ['Stable', 'Very consistent connection, no significant variation between packets.'],
          slightly:  ['Slightly unstable', 'Small variations in response time — normal on Wi-Fi networks.'],
          unstable:  ['Unstable', 'High variation between packets (jitter). May cause stutters in calls and streaming.'],
        },
        lossTier: {
          none: ['No loss', 'All packets arrived. Healthy connection.'],
          min:  ['Minimal loss', 'Very low loss — usually imperceptible.'],
          mod:  ['Moderate loss', 'May cause occasional stutters in calls and games.'],
          high: ['High loss', 'Something is blocking or dropping packets. Check cables, Wi-Fi and firewall.'],
        },
        overall: {
          problems: ['Connection with issues', 'Results for {host} suggest something to investigate. See details below.'],
          okay:     ['Reasonable connection', 'You can use {host} normally, but there\'s room for improvement.'],
          healthy:  ['Healthy connection',    '{host} is responding well — no signs of problems.'],
        },
        verdictH: {
          lat:  'Average latency — {label} ({avg} ms)',
          jit:  'Stability — {label} (jitter {mdev} ms)',
          loss: 'Packet loss — {label} ({loss}%)',
        },
      },
      whois: {
        title: 'WHOIS',
        lede:  'Find out who registered a domain, when, with which registrar and when it expires.',
        domainLabel: 'Domain', placeholder: 'example.com',
        domain: 'Domain',
        expiresIn: 'expires in {days} days',
        rawTitle: 'Raw WHOIS response',
        tips: [
          '.br domains are registered via Registro.br.',
          'Many registrars offer WHOIS privacy — personal data is hidden.',
          'Renew in advance to avoid losing the domain.',
        ],
      },
      speed: {
        title: 'Speed test',
        lede:  'Measures your download, upload and latency. Demonstration — in production it would use real servers.',
        ping: 'Ping', download: 'Download', upload: 'Upload',
        start: 'Start test', again: 'Test again',
        measuring: 'Measuring {phase}…',
        labels: { ping: 'PING', download: 'DOWNLOAD', upload: 'UPLOAD' },
        serverTitle: 'Test server',
        distance: '{ms}ms away',
        tips: [
          'Use a cable or stay close to the router to measure the link\'s real limit.',
          'Close apps using the internet (streaming, backups) before testing.',
          'Speeds between 25–300 Mbps are typical for residential fiber plans.',
        ],
      },
      reverse: {
        title: 'Reverse DNS',
        lede:  'Find out which hostname is associated with an IP address — useful to identify ISPs and troubleshoot email.',
        ipLabel: 'IP address', placeholder: '8.8.8.8',
        ipTitle: 'Looked-up IP', ptrTitle: 'Hostname (PTR)',
        valid: 'FCrDNS valid', invalid: 'FCrDNS invalid',
        tips: [
          'Trustworthy mail servers require rDNS to be configured.',
          'Not every IP has a PTR record — some residential ISPs don\'t set it.',
          'Confirm with forward-confirmed reverse DNS (FCrDNS) for full validation.',
        ],
      },
      adSlot: 'Ad space',
      adMobile: 'Ad space · 320×100 (mobile)',
      adLeader: 'Ad space · 728×90 (leaderboard)',
    },
    legal: { eyebrow: 'Legal', updated: 'Last updated: {date}', toc: 'Contents' },
    seo: {
      home:        { title: 'Check My IP — What is my IP address? Free Network Tools', desc: 'Find your public IP address (IPv4 and IPv6) and location. DNS Lookup, Ping, WHOIS, speed test and reverse DNS — free, in English.' },
      dns:         { title: 'DNS Lookup — Ver meu IP',         desc: 'Look up A, AAAA, MX, TXT, NS, CNAME and SOA DNS records for any domain in real time.' },
      ping:        { title: 'Ping / Site Test — Ver meu IP',   desc: 'Test latency to any server directly from your browser. Detailed statistics and result interpretation.' },
      whois:       { title: 'WHOIS — Ver meu IP',              desc: 'Find out who registered a domain, the registrar, creation/expiry dates and nameservers — including .br via Registro.br.' },
      speed:       { title: 'Speed Test — Ver meu IP',         desc: 'Measure your download, upload and connection latency.' },
      reverse:     { title: 'Reverse DNS — Ver meu IP',        desc: 'Look up the hostname (PTR) associated with an IP, with FCrDNS validation.' },
      privacidade: { title: 'Privacy Policy — Ver meu IP',     desc: 'How we handle your data in compliance with LGPD and GDPR.' },
      termos:      { title: 'Terms of Use — Ver meu IP',       desc: 'Terms of use, limits and responsibilities of the Ver meu IP service.' },
    },
  },

  es: {
    htmlLang: 'es',
    nav: { home: 'Mi IP', dns: 'DNS Lookup', ping: 'Ping', whois: 'WHOIS', speed: 'Velocidad', reverse: 'DNS Inverso', menu: 'Menú' },
    theme: { light: 'Modo claro', dark: 'Modo oscuro' },
    lang:  { label: 'Idioma', pt: 'Português', en: 'English', es: 'Español' },
    common: { copy: 'Copiar', loading: 'Cargando…', empty: '—' },
    home: {
      eyebrow: 'Ver mi IP',
      titleA: 'Tu dirección IP, en ', titleHi: 'tiempo real', titleZ: '.',
      lede: 'Detectamos automáticamente tu IPv4, IPv6, ubicación aproximada, proveedor y zona horaria. Todo directamente desde tu navegador.',
    },
    ipCard: {
      label: 'Tu dirección pública', connected: 'Conectado',
      city: 'Ciudad', state: 'Estado/Provincia', country: 'País',
      timezone: 'Zona horaria', asn: 'ASN', isp: 'Proveedor (ISP)', hostname: 'Hostname',
    },
    qt: {
      dns:    { t: 'DNS Lookup',   s: 'Registros A, AAAA, MX, TXT' },
      ping:   { t: 'Ping',         s: 'Mide la latencia de un sitio' },
      whois:  { t: 'WHOIS',        s: 'Quién registró un dominio' },
      speed:  { t: 'Velocidad',    s: 'Descarga y subida' },
      reverse:{ t: 'DNS Inverso',  s: 'IP → hostname' },
      myip:   { t: 'Mi IP',        s: 'Detección automática' },
    },
    vpn: {
      tag:   'Patrocinado · enlace de afiliado',
      title: 'Oculta tu IP con NordVPN',
      desc:  'Cifrado AES-256, servidores en todo el mundo. Desde {sym}{price}/{period}.',
      cta:   'Ver oferta',
      mTitle:'Protege tu conexión', mDesc: 'VPN con servidores en todo el mundo', mCta: 'Probar gratis',
    },
    history: {
      title: 'Historial reciente',
      empty: 'Tus últimas consultas aparecerán aquí. Nada se envía al servidor — se guarda solo en este navegador.',
      clear: 'Borrar',
    },
    faq: {
      eyebrow: 'Preguntas frecuentes',
      title: 'Aprende sobre direcciones IP',
      sub: 'Conceptos esenciales explicados sin jerga innecesaria.',
      items: [
        { q: '¿Qué es una dirección IP?', a: 'Una dirección IP (Internet Protocol) es un identificador único asignado a tu dispositivo en internet. Funciona como una dirección postal para tu conexión.' },
        { q: '¿Cuál es la diferencia entre IPv4 e IPv6?', a: 'IPv4 usa 4 grupos de números (ej.: 187.32.144.218) con unos 4.300 millones de direcciones posibles. IPv6 usa 8 grupos hexadecimales, ofreciendo un número virtualmente infinito — el estándar moderno.' },
        { q: '¿Por qué mi ubicación aparece un poco diferente?', a: 'La geolocalización por IP usa bases de datos que asignan bloques de IP a regiones aproximadas. Suele acertar la ciudad, pero puede mostrar el centro de datos del proveedor. Para ubicación precisa se necesita GPS.' },
        { q: '¿Es seguro mostrar mi IP?', a: 'Tu IP pública ya es visible para cualquier sitio que visitas. Por sí sola no revela tu nombre ni dirección física — pero combinada con cookies y registros del proveedor puede usarse para rastrearte. Una VPN ayuda a ocultarla.' },
        { q: '¿Qué es una VPN y cuándo debería usarla?', a: 'Una VPN crea un túnel cifrado entre tú y un servidor remoto, haciendo que los sitios vean la IP del servidor en lugar de la tuya. Útil en Wi-Fi públicas, para contenido regional y privacidad.' },
        { q: '¿Ver meu IP guarda mis datos?', a: 'No. Detectamos tu IP en el momento del acceso para mostrártela, pero no la almacenamos. El historial de consultas vive solo en tu navegador (localStorage).' },
      ],
    },
    adblock: {
      title: 'Bloqueador de anuncios detectado',
      desc:  'Detectamos que estás usando un bloqueador de anuncios. <strong>Ver meu IP</strong> es 100 % gratuito y depende de los ingresos publicitarios para cubrir los costes del servidor. Por favor, desactiva tu bloqueador para ayudar a mantener el sitio gratis.',
      btn1:  'Cómo desactivar el bloqueador',
      btn2:  'Lo entiendo, pero lo mantendré activado',
    },
    rateLimit: {
      title: 'Límite de verificaciones alcanzado',
      desc:  'Para proteger nuestra infraestructura, permitimos un máximo de <strong>4 verificaciones de IP cada 12 horas</strong>. Tu cuota se renovará en:',
      vpnHint: '¿Usando una VPN? Tu IP puede cambiar y los límites se renuevan automáticamente por dirección.',
      vpnCta:  'Obtener VPN — oculta tu IP',
    },
    cookies: {
      bigText: '🍪 Este sitio usa cookies.',
      desc:    'Usamos cookies propias y de terceros (Google Analytics, AdSense) para mejorar tu experiencia, analizar el tráfico y mostrar anuncios. Al continuar navegando, aceptas nuestra',
      policyLink:  'Política de Cookies',
      privacyLink: 'Política de Privacidad',
      and:    'y',
      learn:  'Saber más',
      accept: 'Aceptar',
    },
    footer: {
      tagline: 'Herramientas gratuitas de red. Descubre tu IP, consulta DNS, haz ping a sitios y más — todo desde el navegador.',
      tools: 'Herramientas', learn: 'Aprende', about: 'Acerca',
      whatIp: '¿Qué es una IP?', v4v6: 'IPv4 vs IPv6', privacy: 'Privacidad', glossary: 'Glosario',
      contact: 'Contacto', privacyPolicy: 'Política de Privacidad', terms: 'Términos de Uso',
      copyright: '© {year} Ver meu IP', disclaimer: 'Los datos mostrados son ejemplos demostrativos.',
    },
    tools: {
      eyebrow: 'Herramienta', tipsTitle: 'Consejos',
      btn: { go: 'Consultar', loading: 'Consultando…' },
      dns: {
        title: 'Consulta DNS',
        lede:  'Mira a qué servidores apunta un dominio. Soporta registros A, AAAA, MX, TXT, NS y CNAME.',
        domainLabel: 'Dominio', placeholder: 'ejemplo.com',
        results: 'Resultados', count: '{n} registros', countOne: '{n} registro',
        empty: 'No se encontraron registros {type} para este dominio.',
        thType: 'Tipo', thName: 'Nombre', thValue: 'Valor', thTtl: 'TTL',
        tips: [
          'Los registros A apuntan a IPv4; AAAA a IPv6.',
          'MX define los servidores de correo.',
          'TXT se usa para SPF, DKIM y verificación de dominio.',
          'Los cambios de DNS pueden tardar hasta 48 h en propagarse.',
        ],
      },
      ping: {
        title: 'Prueba tu sitio (Ping)',
        lede:  'Mide la latencia hasta cualquier servidor — exactamente como el comando ping del terminal, pero desde el navegador.',
        hostLabel: 'Host o IP', placeholder: 'ejemplo.com',
        start: 'Iniciar ping', stop: 'Detener',
        ready: 'Listo. Pulsa "Iniciar ping" para empezar.',
        running: 'en ejecución',
        statsTitle: 'Resumen estadístico',
        min: 'Mín.', avg: 'Med.', max: 'Máx.', loss: 'Pérdida',
        meaning: '¿Qué significa esto?',
        latencyRef: 'Referencias de latencia',
        ranges: [
          { range: '< 30 ms',   use: 'Juegos competitivos' },
          { range: '30–60 ms',  use: 'Streaming · llamadas' },
          { range: '60–150 ms', use: 'Navegación general' },
          { range: '> 150 ms',  use: 'Servidor lejano' },
        ],
        tips: [
          'Latencia por debajo de 50 ms es excelente para la mayoría.',
          'Pérdida de paquetes superior al 1 % indica problema de red.',
          'Usa IP en lugar de dominio para aislar problemas de DNS.',
          'ICMP puede estar bloqueado por algunos firewalls.',
        ],
        latTier: {
          excellent: ['Excelente', 'Latencia óptima — ideal para juegos online competitivos, videollamadas y aplicaciones en tiempo real.'],
          veryGood:  ['Muy buena', 'Buena latencia para la mayoría de usos: streaming, llamadas, juegos casuales y navegación fluida.'],
          ok:        ['Aceptable', 'Funciona bien para navegación y streaming, pero puede haber un pequeño retraso en juegos rápidos y videollamadas.'],
          high:      ['Alta', 'Notarás lentitud en llamadas y juegos. Aceptable para navegación y correo.'],
          veryHigh:  ['Muy alta', 'Hay retraso perceptible. Verifica tu conexión, distancia al servidor o si hay otra ruta disponible.'],
        },
        jitTier: {
          stable:    ['Estable', 'Conexión muy consistente, sin variación significativa entre paquetes.'],
          slightly:  ['Ligeramente inestable', 'Pequeñas variaciones en el tiempo de respuesta — normal en redes Wi-Fi.'],
          unstable:  ['Inestable', 'Variación alta entre paquetes (jitter). Puede causar interrupciones en llamadas y streaming.'],
        },
        lossTier: {
          none: ['Sin pérdidas', 'Todos los paquetes llegaron. Conexión íntegra.'],
          min:  ['Pérdida mínima', 'Pérdida muy baja — generalmente imperceptible.'],
          mod:  ['Pérdida moderada', 'Puede causar cortes ocasionales en llamadas y juegos.'],
          high: ['Pérdida alta', 'Algo está bloqueando o descartando paquetes. Verifica cables, Wi-Fi y firewall.'],
        },
        overall: {
          problems: ['Conexión con problemas', 'Los resultados para {host} indican algo a investigar. Mira los detalles abajo.'],
          okay:     ['Conexión razonable', 'Puedes usar {host} normalmente, pero hay margen de mejora.'],
          healthy:  ['Conexión saludable', '{host} está respondiendo bien — sin indicios de problemas.'],
        },
        verdictH: {
          lat:  'Latencia media — {label} ({avg} ms)',
          jit:  'Estabilidad — {label} (jitter {mdev} ms)',
          loss: 'Pérdida de paquetes — {label} ({loss}%)',
        },
      },
      whois: {
        title: 'WHOIS',
        lede:  'Descubre quién registró un dominio, cuándo, con qué registrador y cuándo expira.',
        domainLabel: 'Dominio', placeholder: 'ejemplo.com',
        domain: 'Dominio',
        expiresIn: 'expira en {days} días',
        rawTitle: 'Respuesta WHOIS bruta',
        tips: [
          'Los dominios .br se registran a través de Registro.br.',
          'Muchos registradores ofrecen privacidad WHOIS — los datos personales se ocultan.',
          'Renueva con antelación para no perder el dominio.',
        ],
      },
      speed: {
        title: 'Test de velocidad',
        lede:  'Mide tu velocidad de descarga, subida y la latencia de tu conexión. Demostrativo — en producción usaría servidores reales.',
        ping: 'Ping', download: 'Descarga', upload: 'Subida',
        start: 'Iniciar prueba', again: 'Probar de nuevo',
        measuring: 'Midiendo {phase}…',
        labels: { ping: 'PING', download: 'DESCARGA', upload: 'SUBIDA' },
        serverTitle: 'Servidor de prueba',
        distance: '{ms}ms de distancia',
        tips: [
          'Conecta el cable o sitúate cerca del router para medir el límite real del enlace.',
          'Cierra apps que usen internet (streaming, backups) antes de probar.',
          'Velocidades entre 25–300 Mbps son típicas en planes de fibra residencial.',
        ],
      },
      reverse: {
        title: 'DNS Inverso',
        lede:  'Descubre qué hostname está asociado a una dirección IP — útil para identificar proveedores y diagnosticar correos.',
        ipLabel: 'Dirección IP', placeholder: '8.8.8.8',
        ipTitle: 'IP consultada', ptrTitle: 'Hostname (PTR)',
        valid: 'FCrDNS válido', invalid: 'FCrDNS inválido',
        tips: [
          'Los servidores de correo confiables requieren rDNS configurado.',
          'No toda IP tiene registro PTR — algunos proveedores residenciales no lo configuran.',
          'Confirma con forward-confirmed reverse DNS (FCrDNS) para validación completa.',
        ],
      },
      adSlot: 'Espacio para anuncio',
      adMobile: 'Espacio para anuncio · 320×100 (móvil)',
      adLeader: 'Espacio para anuncio · 728×90 (leaderboard)',
    },
    legal: { eyebrow: 'Legal', updated: 'Última actualización: {date}', toc: 'Índice' },
    seo: {
      home:        { title: 'Ver mi IP — ¿Cuál es mi dirección IP? Herramientas Gratis', desc: 'Descubre tu dirección IP pública (IPv4 e IPv6) y ubicación. DNS Lookup, Ping, WHOIS, test de velocidad y DNS inverso — gratis, en español.' },
      dns:         { title: 'Consulta DNS — Ver meu IP',       desc: 'Consulta registros DNS A, AAAA, MX, TXT, NS, CNAME y SOA de cualquier dominio en tiempo real.' },
      ping:        { title: 'Ping / Prueba de sitio — Ver meu IP', desc: 'Mide la latencia hasta cualquier servidor desde el navegador. Estadísticas detalladas e interpretación.' },
      whois:       { title: 'WHOIS — Ver meu IP',              desc: 'Descubre quién registró un dominio, el registrador, fechas y nameservers — incluyendo .br vía Registro.br.' },
      speed:       { title: 'Test de Velocidad — Ver meu IP',  desc: 'Mide la velocidad de descarga, subida y la latencia de tu conexión.' },
      reverse:     { title: 'DNS Inverso — Ver meu IP',        desc: 'Consulta el hostname (PTR) asociado a una IP, con validación FCrDNS.' },
      privacidade: { title: 'Política de Privacidad — Ver meu IP', desc: 'Cómo tratamos tus datos conforme a la LGPD y el RGPD/GDPR.' },
      termos:      { title: 'Términos de Uso — Ver meu IP',    desc: 'Términos de uso, límites y responsabilidades del servicio Ver meu IP.' },
    },
  },
};

// ── Detection + state ──────────────────────────────────────────────────────
function detectInitialLocale() {
  try {
    const saved = localStorage.getItem(LOCALE_KEY);
    if (saved && SUPPORTED.includes(saved)) return saved;
  } catch {}
  const lang = ((navigator.language || navigator.userLanguage || 'pt') + '').toLowerCase();
  if (lang.startsWith('pt')) return 'pt';
  if (lang.startsWith('es')) return 'es';
  if (lang.startsWith('en')) return 'en';
  return 'pt';
}

let __locale = detectInitialLocale();

function setLocale(loc) {
  if (!SUPPORTED.includes(loc) || loc === __locale) return;
  __locale = loc;
  try { localStorage.setItem(LOCALE_KEY, loc); } catch {}
  document.documentElement.lang = LOCALES[loc].htmlLang;
  window.dispatchEvent(new CustomEvent('vermeip:locale-change', { detail: loc }));
}

function getLocale() { return __locale; }

document.documentElement.lang = LOCALES[__locale].htmlLang;

function useLocale() {
  const [loc, set] = React.useState(__locale);
  React.useEffect(() => {
    const fn = () => set(__locale);
    window.addEventListener('vermeip:locale-change', fn);
    return () => window.removeEventListener('vermeip:locale-change', fn);
  }, []);
  return loc;
}

function lookup(locale, key) {
  const parts = key.split('.');
  let v = LOCALES[locale];
  for (const p of parts) { if (v == null) break; v = v[p]; }
  if (v == null && locale !== 'pt') {
    v = LOCALES.pt;
    for (const p of parts) { if (v == null) break; v = v[p]; }
  }
  return v;
}

function interp(s, vars) {
  if (typeof s !== 'string' || !vars) return s;
  return s.replace(/\{(\w+)\}/g, (_, k) => (vars[k] != null ? vars[k] : `{${k}}`));
}

function useT() {
  const locale = useLocale();
  return React.useCallback((key, vars) => {
    const v = lookup(locale, key);
    return typeof v === 'string' ? interp(v, vars) : v;
  }, [locale]);
}

Object.assign(window, {
  LOCALES, REGIONS, SUPPORTED,
  useLocale, useT, setLocale, getLocale, getRegion,
});
