// Rumbo — Currency helpers & FX rates

const SUPPORTED_CURRENCIES = [
  { code: 'ARS',  name: 'Peso Argentino',  symbol: '$',   flag: '🇦🇷' },
  { code: 'USD',  name: 'Dólar',           symbol: 'US$', flag: '🇺🇸' },
  { code: 'PEN',  name: 'Sol Peruano',     symbol: 'S/',  flag: '🇵🇪' },
  { code: 'MXN',  name: 'Peso Mexicano',   symbol: 'MX$', flag: '🇲🇽' },
  { code: 'EUR',  name: 'Euro',            symbol: '€',   flag: '🇪🇺' },
  { code: 'BRL',  name: 'Real Brasileño',  symbol: 'R$',  flag: '🇧🇷' },
  { code: 'UYU',  name: 'Peso Uruguayo',   symbol: '$U',  flag: '🇺🇾' },
  { code: 'USDT', name: 'USDT Crypto',     symbol: '₮',   flag: '🔷' },
];

const DEFAULT_FX_RATES = {
  ARS: 1, USD: 1040, PEN: 280, MXN: 55, EUR: 1150, BRL: 200, UYU: 25, USDT: 1040,
};

const FREQUENCIES = {
  diario:    { label: 'Diario',    multiplier: 30.4 },
  semanal:   { label: 'Semanal',   multiplier: 4.33 },
  quincenal: { label: 'Quincenal', multiplier: 2    },
  mensual:   { label: 'Mensual',   multiplier: 1    },
  anual:     { label: 'Anual',     multiplier: 1/12 },
};

function convertToBase(amount, fromCurrency, fxRates, baseCurrency = 'ARS') {
  if (fromCurrency === baseCurrency) return amount;
  const toARS   = fxRates[fromCurrency]  || DEFAULT_FX_RATES[fromCurrency]  || 1;
  const fromARS = fxRates[baseCurrency]  || DEFAULT_FX_RATES[baseCurrency]  || 1;
  return amount * toARS / fromARS;
}

function fmtCurrency(amount, currency = 'ARS') {
  const cur = SUPPORTED_CURRENCIES.find(c => c.code === currency);
  const sym = cur ? cur.symbol : currency;
  const abs = Math.abs(amount);
  if (abs >= 1000000) return `${sym}${(amount/1000000).toFixed(1)}M`;
  if (abs >= 1000)    return `${sym}${(amount/1000).toFixed(0)}K`;
  return `${sym}${Math.round(amount).toLocaleString('es-AR')}`;
}

function fmtCurrencyFull(amount, currency = 'ARS') {
  const cur = SUPPORTED_CURRENCIES.find(c => c.code === currency);
  const sym = cur ? cur.symbol : currency;
  return `${sym}${Math.round(amount).toLocaleString('es-AR')}`;
}

function getCurrencyInfo(code) {
  return SUPPORTED_CURRENCIES.find(c => c.code === code) || { code, name: code, symbol: code, flag: '🌐' };
}

function getDaysUntilDue(dueDay) {
  const today = new Date();
  const target = new Date(today.getFullYear(), today.getMonth(), dueDay);
  if (target < today) target.setMonth(target.getMonth() + 1);
  return Math.round((target - today) / (1000 * 60 * 60 * 24));
}

function urgencyColor(days) {
  if (days <= 2)  return '#F43F5E';
  if (days <= 5)  return '#F59E0B';
  if (days <= 10) return '#6366F1';
  return '#475569';
}

function urgencyBg(days) {
  if (days <= 2)  return '#F43F5E12';
  if (days <= 5)  return '#F59E0B12';
  if (days <= 10) return '#6366F112';
  return '#13141F';
}

function getMonthlyFixedTotal(fixedExpenses, fxRates, baseCurrency) {
  return (fixedExpenses || []).filter(f => f.active).reduce((s, f) => {
    const freq = FREQUENCIES[f.frequency || 'mensual'];
    const monthly = f.amount * (freq ? freq.multiplier : 1);
    return s + convertToBase(monthly, f.currency, fxRates, baseCurrency);
  }, 0);
}

Object.assign(window, {
  SUPPORTED_CURRENCIES, DEFAULT_FX_RATES, FREQUENCIES,
  convertToBase, fmtCurrency, fmtCurrencyFull, getCurrencyInfo,
  getDaysUntilDue, urgencyColor, urgencyBg, getMonthlyFixedTotal,
});
