/**
 * Lista de moedas suportadas pelo sistema
 * Inclui código ISO, símbolo, nome e configuração de formatação
 */
export const currencies = [
  // Américas
  { code: 'BRL', symbol: 'R$', name: 'currencies.BRL', locale: 'pt-BR', decimals: 2 },
  { code: 'USD', symbol: '$', name: 'currencies.USD', locale: 'en-US', decimals: 2 },
  { code: 'ARS', symbol: '$', name: 'currencies.ARS', locale: 'es-AR', decimals: 2 },
  { code: 'CLP', symbol: '$', name: 'currencies.CLP', locale: 'es-CL', decimals: 0 },
  { code: 'COP', symbol: '$', name: 'currencies.COP', locale: 'es-CO', decimals: 0 },
  { code: 'MXN', symbol: '$', name: 'currencies.MXN', locale: 'es-MX', decimals: 2 },
  { code: 'PEN', symbol: 'S/', name: 'currencies.PEN', locale: 'es-PE', decimals: 2 },
  { code: 'UYU', symbol: '$U', name: 'currencies.UYU', locale: 'es-UY', decimals: 2 },
  { code: 'CAD', symbol: 'C$', name: 'currencies.CAD', locale: 'en-CA', decimals: 2 },
  
  // Europa
  { code: 'EUR', symbol: '€', name: 'currencies.EUR', locale: 'es-ES', decimals: 2 },
  { code: 'GBP', symbol: '£', name: 'currencies.GBP', locale: 'en-GB', decimals: 2 },
  { code: 'CHF', symbol: 'CHF', name: 'currencies.CHF', locale: 'de-CH', decimals: 2 },
  
  // Ásia-Pacífico
  { code: 'JPY', symbol: '¥', name: 'currencies.JPY', locale: 'ja-JP', decimals: 0 },
  { code: 'CNY', symbol: '¥', name: 'currencies.CNY', locale: 'zh-CN', decimals: 2 },
  { code: 'AUD', symbol: 'A$', name: 'currencies.AUD', locale: 'en-AU', decimals: 2 },
];

/**
 * Obtém uma moeda pelo código ISO
 */
export const getCurrencyByCode = (code) => {
  return currencies.find(c => c.code === code) || currencies[0]; // BRL como fallback
};

/**
 * Formata um valor monetário de acordo com a moeda
 * @param {number} value - Valor a formatar
 * @param {string} currencyCode - Código ISO da moeda (ex: 'BRL', 'USD')
 * @param {object} options - Opções adicionais de formatação
 * @returns {string} - Valor formatado
 */
export const formatCurrency = (value, currencyCode = 'BRL', options = {}) => {
  const currency = getCurrencyByCode(currencyCode);
  const numValue = parseFloat(value) || 0;
  
  try {
    return new Intl.NumberFormat(currency.locale, {
      style: 'currency',
      currency: currency.code,
      minimumFractionDigits: currency.decimals,
      maximumFractionDigits: currency.decimals,
      ...options,
    }).format(numValue);
  } catch (error) {
    // Fallback simples se Intl falhar
    return `${currency.symbol} ${numValue.toFixed(currency.decimals)}`;
  }
};

/**
 * Formata apenas o número sem símbolo de moeda
 * @param {number} value - Valor a formatar
 * @param {string} currencyCode - Código ISO da moeda
 * @returns {string} - Número formatado
 */
export const formatNumber = (value, currencyCode = 'BRL') => {
  const currency = getCurrencyByCode(currencyCode);
  const numValue = parseFloat(value) || 0;
  
  try {
    return new Intl.NumberFormat(currency.locale, {
      minimumFractionDigits: currency.decimals,
      maximumFractionDigits: currency.decimals,
    }).format(numValue);
  } catch (error) {
    return numValue.toFixed(currency.decimals);
  }
};

/**
 * Converte string formatada para número
 * Remove símbolos de moeda e formatação local
 * @param {string} formattedValue - Valor formatado
 * @returns {number} - Valor numérico
 */
export const parseCurrencyValue = (formattedValue) => {
  if (typeof formattedValue === 'number') return formattedValue;
  if (!formattedValue) return 0;
  
  // Remove tudo exceto números, vírgula, ponto e sinal negativo
  const cleaned = formattedValue
    .replace(/[^\d,.\-]/g, '')
    // Trata caso brasileiro (1.234,56) vs americano (1,234.56)
    .replace(/\.(?=.*,)/g, '') // Remove pontos antes de vírgula (separador de milhar BR)
    .replace(/,(?=\d{0,2}$)/g, '.'); // Vírgula decimal para ponto
  
  return parseFloat(cleaned) || 0;
};

/**
 * Lista de moedas mais comuns (para mostrar primeiro em seletores)
 */
export const commonCurrencies = ['BRL', 'USD', 'EUR', 'GBP', 'ARS', 'MXN'];

/**
 * Moeda padrão do sistema
 */
export const defaultCurrency = 'BRL';

/**
 * Obtém lista de moedas ordenadas (comuns primeiro)
 */
export const getSortedCurrencies = () => {
  const common = currencies.filter(c => commonCurrencies.includes(c.code));
  const others = currencies.filter(c => !commonCurrencies.includes(c.code));
  return [...common, ...others];
};
