// Rumbo — Gastos Fijos · v3 · Lista "Próximos Vencimientos" + semáforo de urgencia

const { useState: useStCal, useMemo: useMemoCAL, useEffect: useEffectCal } = React;

/* ── Drawer "Nuevo gasto fijo" — selector dinámico de frecuencia ── */
const AddFixedDrawer = ({ onClose, onAdd, fxRates, data }) => {
  const MONTHS_NAMES = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];

  const [form, setF] = useStCal({
    name: '', amount: '', currency: 'ARS',
    dueDay: 1,       // mensual: día 1-31 | quincenal: día de inicio
    weekDay: 0,      // semanal: 0=Lun … 6=Dom
    annualDay: 1, annualMonth: 1,
    category: 'Servicios', frequency: 'mensual', iconName: 'home',
    active: true, reminder: 1,
  });
  const [showCurrencyPicker, setShowCurrencyPicker] = useStCal(false);
  const [showIconPicker,     setShowIconPicker]     = useStCal(false);

  const WEEK_DAYS = [
    { short:'L', full:'Lunes'     },
    { short:'M', full:'Martes'    },
    { short:'M', full:'Miércoles' },
    { short:'J', full:'Jueves'    },
    { short:'V', full:'Viernes'   },
    { short:'S', full:'Sábado'    },
    { short:'D', full:'Domingo'   },
  ];

  const ICONS = [
    'home','building','wifi','smartphone','zap','droplet','flame',
    'film','music','headphones','gamepad','cpu',
    'heart','pill','coffee','shoppingCart',
    'car','plane','bookOpen','briefcase','palette','gift','lightbulb','package',
  ];
  const CATS  = ['Hogar','Servicios','Entretenimiento','Salud','IA / Software','Transporte','Transferencias','Educación','Otros'];
  const REMINDERS = [
    { value: 0, label: 'El mismo día' },
    { value: 1, label: '1 día antes'  },
    { value: 3, label: '3 días antes' },
  ];

  const selCur   = SUPPORTED_CURRENCIES.find(c => c.code === form.currency) || SUPPORTED_CURRENCIES[0];
  const secCard  = { background:'var(--surface-2)', border:'1.5px solid var(--border)', borderRadius:'var(--r-lg)', padding:'14px 18px', marginBottom:14 };
  const lbl      = { fontSize:11, fontWeight:700, color:'var(--t5)', textTransform:'uppercase', letterSpacing:'0.4px', marginBottom:8 };
  const rawInput = { width:'100%', background:'none', border:'none', outline:'none', color:'var(--t1)', fontSize:15, fontFamily:'var(--font)', fontWeight:500 };
  const noSpin   = { WebkitAppearance:'none', MozAppearance:'textfield' };

  // Helpers — formato decimal es-AR
  const parseAmount = (s) => {
    let v = String(s || '').replace(/[^\d,]/g, '');
    const parts = v.split(',');
    if (parts.length > 2) v = parts[0] + ',' + parts.slice(1).join('');
    const [i, d] = v.split(',');
    return d !== undefined ? `${i},${d.slice(0,2)}` : (i || '');
  };
  const fmtAmount = (raw) => {
    if (raw === '' || raw == null) return '';
    const [i, d] = String(raw).split(',');
    const intNum = Number(i || '0');
    const intFmt = isNaN(intNum) ? '0' : intNum.toLocaleString('es-AR');
    return d !== undefined ? `${intFmt},${d}` : intFmt;
  };
  const toNumber = (raw) => {
    if (raw === '' || raw == null) return 0;
    return parseFloat(String(raw).replace(',', '.')) || 0;
  };

  // Contexto financiero — gastos fijos mensuales actuales + impacto del nuevo
  const baseCurrency  = data?.settings?.currency || 'ARS';
  const fixedExpenses = data?.fixedExpenses || [];
  const totalMensualActual = (typeof getMonthlyFixedTotal === 'function')
    ? getMonthlyFixedTotal(fixedExpenses, fxRates, baseCurrency)
    : fixedExpenses.filter(f => f.active).reduce((s,f) => s + (f.amount||0), 0);
  const nuevoMontoBase = (() => {
    const n = toNumber(form.amount);
    if (n === 0) return 0;
    const mult = (typeof FREQUENCIES !== 'undefined' && FREQUENCIES[form.frequency]?.multiplier) || 1;
    const monthly = n * mult;
    return (typeof convertToBase === 'function')
      ? convertToBase(monthly, form.currency, fxRates, baseCurrency)
      : monthly;
  })();
  const totalMensualFinal = totalMensualActual + nuevoMontoBase;

  // ── Frase resumen dinámica ──────────────────────────────
  const amtStr = form.amount
    ? `${selCur.symbol}${fmtAmount(form.amount)}`
    : 'Este gasto';
  const reminderLabel = REMINDERS.find(r => r.value === form.reminder)?.label?.toLowerCase() || '1 día antes';

  const summaryPhrase = (() => {
    switch (form.frequency) {
      case 'diario':
        return `${amtStr} se registrará todos los días automáticamente.`;
      case 'semanal':
        return `${amtStr} se registrará cada ${WEEK_DAYS[form.weekDay].full} y te avisaremos ${reminderLabel}.`;
      case 'quincenal':
        return form.dueDay
          ? `${amtStr} se registrará a partir del día ${form.dueDay} y se repetirá cada 15 días. Te avisaremos ${reminderLabel}.`
          : `${amtStr} se repetirá cada 15 días. Elegí el día de inicio.`;
      case 'mensual':
        return `${amtStr} se registrará el día ${form.dueDay} de cada mes y te avisaremos ${reminderLabel}.`;
      case 'anual':
        return `${amtStr} se registrará el ${form.annualDay} de ${MONTHS_NAMES[form.annualMonth-1]} de cada año y te avisaremos ${reminderLabel}.`;
      default: return '';
    }
  })();

  // ── Submit ─────────────────────────────────────────────
  const submit = () => {
    if (!form.name || !form.amount) { window.showToast('Completá nombre y monto', 'warning'); return; }

    const dueDay = form.frequency === 'anual' ? form.annualDay : parseInt(form.dueDay) || 1;

    onAdd({
      ...form, id: 'f' + Date.now(),
      amount: toNumber(form.amount),
      dueDay,
    });
    onClose();
    window.showToast('Gasto fijo agregado', 'success');
  };

  return (
    <>
      <div className="drawer-backdrop" onClick={onClose} />
      <div className="drawer">
        <div className="drawer-handle" />

        {/* Header */}
        <div style={{ display:'flex', alignItems:'center', gap:12, padding:'10px 20px 16px', borderBottom:'1px solid var(--border)' }}>
          <button onClick={onClose} style={{ width:34,height:34,borderRadius:'var(--r-md)',background:'var(--surface-2)',border:'1px solid var(--border)',display:'flex',alignItems:'center',justifyContent:'center',flexShrink:0 }}>
            <Icon name="x" size={17} color="var(--t3)" />
          </button>
          <div>
            <div style={{ fontSize:16, fontWeight:800, color:'var(--t1)' }}>Nuevo gasto fijo</div>
            <div style={{ fontSize:12, color:'var(--t4)' }}>Servicio, suscripción o cuota</div>
          </div>
        </div>

        <div style={{ padding:'18px 20px' }}>

          {/* Tira de contexto financiero */}
          <div style={{
            display:'flex', alignItems:'center', justifyContent:'space-between', gap:12,
            padding:'10px 14px', marginBottom:14,
            background:'var(--surface-2)', border:'1.5px solid var(--border)', borderRadius:'var(--r-lg)',
          }}>
            <div style={{ display:'flex', alignItems:'center', gap:8 }}>
              <div style={{ width:28, height:28, borderRadius:'var(--r-md)', background:'var(--warning-bg, rgba(245,158,11,0.15))', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
                <Icon name="refresh" size={14} color="var(--warning)" />
              </div>
              <div style={{ display:'flex', flexDirection:'column' }}>
                <span style={{ fontSize:10, color:'var(--t5)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.4px' }}>Fijos por mes</span>
                <span style={{ fontSize:13, color:'var(--t2)', fontWeight:700, fontVariantNumeric:'tabular-nums' }}>
                  {nuevoMontoBase > 0
                    ? <>{fmtFull(totalMensualActual)} → <span style={{ color:'var(--warning)' }}>{fmtFull(totalMensualFinal)}</span></>
                    : fmtFull(totalMensualActual)
                  }
                </span>
              </div>
            </div>
            {nuevoMontoBase > 0 && (
              <div style={{ fontSize:12, fontWeight:800, color:'var(--warning)', fontVariantNumeric:'tabular-nums' }}>
                +{fmtFull(nuevoMontoBase)}
              </div>
            )}
          </div>

          {/* Ícono — botón que abre el IconPicker */}
          <div style={secCard}>
            <div style={lbl}>Ícono</div>
            <button type="button" onClick={() => setShowIconPicker(true)}
              style={{
                width:'100%', display:'flex', alignItems:'center', gap:12,
                padding:'10px 12px', background:'var(--surface)', border:'1.5px solid var(--border)',
                borderRadius:'var(--r-md)', cursor:'pointer', fontFamily:'var(--font)',
              }}>
              <div style={{ width:36, height:36, borderRadius:'var(--r-md)', background:'var(--accent-muted)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
                <Icon name={form.iconName} size={18} color="var(--accent)" strokeWidth={1.7} />
              </div>
              <span style={{ flex:1, textAlign:'left', fontSize:13, color:'var(--t3)', fontWeight:600 }}>
                Cambiar ícono
              </span>
              <Icon name="chevronRight" size={15} color="var(--t5)" />
            </button>
          </div>

          {/* Nombre */}
          <div style={secCard}>
            <div style={{ ...lbl, display:'flex', justifyContent:'space-between' }}>
              <span>Nombre <span style={{ color:'var(--danger)' }}>*</span></span>
              <span style={{ fontWeight:400, textTransform:'none', letterSpacing:0 }}>{(form.name||'').length}/60</span>
            </div>
            <input type="text" placeholder="Ej. Netflix, Alquiler, Internet…" value={form.name} maxLength={60}
              onChange={e=>setF(f=>({...f,name:e.target.value}))} style={rawInput} />
          </div>

          {/* Monto + moneda */}
          <div style={secCard}>
            <div style={lbl}>Monto <span style={{ color:'var(--danger)' }}>*</span></div>
            <div style={{ display:'flex', alignItems:'center', gap:12 }}>
              <span style={{ fontSize:22, fontWeight:900, color:'var(--danger)', lineHeight:1 }}>–</span>
              <input type="text" inputMode="decimal" placeholder="0" value={fmtAmount(form.amount)}
                onChange={e=>setF(f=>({...f,amount:parseAmount(e.target.value)}))}
                style={{ ...rawInput, fontSize:30, fontWeight:900, fontVariantNumeric:'tabular-nums', flex:1 }} />
              <button type="button" onClick={() => setShowCurrencyPicker(true)}
                style={{ display:'flex',alignItems:'center',gap:6,background:'var(--surface)',border:'1.5px solid var(--border)',borderRadius:'var(--r-md)',padding:'7px 10px',color:'var(--t2)',fontWeight:700,fontSize:13,flexShrink:0,cursor:'pointer' }}>
                <span style={{ fontSize:18 }}>{selCur.flag}</span>
                <span>{selCur.code}</span>
                <Icon name="chevronDown" size={13} color="var(--t4)" />
              </button>
            </div>
          </div>

          {/* ── FRECUENCIA — selector principal ── */}
          <div style={secCard}>
            <div style={lbl}>Frecuencia</div>
            <div style={{ display:'flex', alignItems:'center', gap:10, marginBottom: form.frequency !== 'diario' ? 14 : 0 }}>
              <div style={{ width:34,height:34,borderRadius:'var(--r-md)',background:'var(--surface)',border:'1px solid var(--border)',display:'flex',alignItems:'center',justifyContent:'center',flexShrink:0 }}>
                <Icon name="refresh" size={15} color="var(--t4)" />
              </div>
              <select value={form.frequency} onChange={e => setF(f=>({...f,frequency:e.target.value}))}
                style={{ ...rawInput, cursor:'pointer', fontSize:15, fontWeight:600 }}>
                {Object.entries(FREQUENCIES).map(([k,v]) => <option key={k} value={k}>{v.label}</option>)}
              </select>
              <Icon name="chevronDown" size={15} color="var(--t5)" />
            </div>

            {/* ══ DIARIO — sin selector, solo confirmación ══ */}
            {form.frequency === 'diario' && (
              <div style={{ borderTop:'1px solid var(--border)', paddingTop:12, display:'flex', alignItems:'center', gap:8 }}>
                <div style={{ width:28,height:28,borderRadius:'var(--r-md)',background:'var(--success-bg)',display:'flex',alignItems:'center',justifyContent:'center',flexShrink:0 }}>
                  <Icon name="checkCircle" size={15} color="var(--success)" />
                </div>
                <span style={{ fontSize:12, color:'var(--t3)', lineHeight:1.5 }}>
                  Se registrará automáticamente <strong style={{ color:'var(--t1)' }}>todos los días</strong>.
                </span>
              </div>
            )}

            {/* ══ SEMANAL — 7 botones L M M J V S D ══ */}
            {form.frequency === 'semanal' && (
              <div style={{ borderTop:'1px solid var(--border)', paddingTop:14 }}>
                <div style={lbl}>¿Qué día de la semana?</div>
                <div style={{ display:'grid', gridTemplateColumns:'repeat(7,1fr)', gap:6 }}>
                  {WEEK_DAYS.map((d, i) => {
                    const active = form.weekDay === i;
                    return (
                      <button key={i} type="button" onClick={() => setF(f=>({...f,weekDay:i}))}
                        style={{
                          display:'flex', flexDirection:'column', alignItems:'center', gap:4,
                          padding:'10px 4px', borderRadius:'var(--r-md)', cursor:'pointer',
                          background: active ? 'var(--accent)' : 'var(--surface)',
                          border: `1.5px solid ${active ? 'var(--accent)' : 'var(--border)'}`,
                          boxShadow: active ? 'var(--sh-fab)' : 'none',
                          transition:'all 0.15s',
                        }}>
                        <span style={{ fontSize:13, fontWeight:800, color: active ? '#fff' : 'var(--t2)' }}>{d.short}</span>
                        <span style={{ fontSize:9, color: active ? 'rgba(255,255,255,0.75)' : 'var(--t5)', fontWeight:600 }}>
                          {d.full.slice(0,3)}
                        </span>
                      </button>
                    );
                  })}
                </div>
              </div>
            )}

            {/* ══ QUINCENAL — selector del día de inicio (1-31) ══ */}
            {form.frequency === 'quincenal' && (
              <div style={{ borderTop:'1px solid var(--border)', paddingTop:14 }}>
                <DatePicker
                  label="Día de inicio"
                  value={form.dueDay}
                  onChange={v => setF(f=>({...f,dueDay:v}))}
                  dayOnly
                />
                <div style={{ display:'flex', alignItems:'flex-start', gap:8, background:'var(--accent-muted)', borderRadius:'var(--r-md)', padding:'10px 12px', marginTop:-4 }}>
                  <Icon name="info" size={14} color="var(--accent)" />
                  <span style={{ fontSize:12, color:'var(--accent-text)', lineHeight:1.5 }}>
                    El sistema calculará automáticamente que se repite <strong>cada 15 días</strong> desde el día {form.dueDay || '—'}.
                  </span>
                </div>
              </div>
            )}

            {/* ══ MENSUAL — selector numérico día 1-31 ══ */}
            {form.frequency === 'mensual' && (
              <div style={{ borderTop:'1px solid var(--border)', paddingTop:14 }}>
                <DatePicker
                  label="Día del mes"
                  value={form.dueDay}
                  onChange={v => setF(f=>({...f,dueDay:v}))}
                  dayOnly
                />
              </div>
            )}

            {/* ══ ANUAL — Día (1-31) + Mes ══ */}
            {form.frequency === 'anual' && (
              <div style={{ borderTop:'1px solid var(--border)', paddingTop:14 }}>
                <div style={lbl}>¿Qué día del año vence?</div>
                <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:10, marginBottom:10 }}>
                  {/* Día — grid compacto 1-31 */}
                  <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:'var(--r-md)', padding:'10px 12px' }}>
                    <div style={{ fontSize:10,fontWeight:700,color:'var(--t5)',textTransform:'uppercase',letterSpacing:'0.4px',marginBottom:8 }}>Día</div>
                    <div style={{ display:'grid', gridTemplateColumns:'repeat(4,1fr)', gap:3, maxHeight:120, overflowY:'auto' }}>
                      {Array.from({length:31},(_,i)=>i+1).map(d => (
                        <button key={d} type="button" onClick={() => setF(f=>({...f,annualDay:d}))}
                          style={{
                            padding:'5px 2px', borderRadius:'var(--r-sm)', border:'none', cursor:'pointer',
                            fontSize:12, fontWeight: form.annualDay===d ? 800 : 400,
                            background: form.annualDay===d ? 'var(--accent)' : 'none',
                            color:      form.annualDay===d ? '#fff' : 'var(--t2)',
                            transition:'all 0.12s',
                          }}
                          onMouseEnter={e=>{ if(form.annualDay!==d) e.currentTarget.style.background='var(--surface-3)'; }}
                          onMouseLeave={e=>{ if(form.annualDay!==d) e.currentTarget.style.background='none'; }}>
                          {d}
                        </button>
                      ))}
                    </div>
                  </div>

                  {/* Mes — lista scrolleable */}
                  <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:'var(--r-md)', padding:'10px 12px' }}>
                    <div style={{ fontSize:10,fontWeight:700,color:'var(--t5)',textTransform:'uppercase',letterSpacing:'0.4px',marginBottom:8 }}>Mes</div>
                    <div style={{ display:'flex', flexDirection:'column', gap:2, maxHeight:120, overflowY:'auto' }}>
                      {MONTHS_NAMES.map((m,i) => (
                        <button key={i} type="button" onClick={() => setF(f=>({...f,annualMonth:i+1}))}
                          style={{
                            padding:'5px 8px', borderRadius:'var(--r-sm)', border:'none', cursor:'pointer',
                            fontSize:12, fontWeight: form.annualMonth===i+1 ? 800 : 400,
                            background: form.annualMonth===i+1 ? 'var(--accent)' : 'none',
                            color:      form.annualMonth===i+1 ? '#fff' : 'var(--t2)',
                            textAlign:'left', transition:'all 0.12s',
                          }}
                          onMouseEnter={e=>{ if(form.annualMonth!==i+1) e.currentTarget.style.background='var(--surface-3)'; }}
                          onMouseLeave={e=>{ if(form.annualMonth!==i+1) e.currentTarget.style.background='none'; }}>
                          {m}
                        </button>
                      ))}
                    </div>
                  </div>
                </div>

                {/* Confirmación visual */}
                <div style={{ display:'flex', alignItems:'center', gap:7, background:'var(--accent-muted)', borderRadius:'var(--r-md)', padding:'9px 12px' }}>
                  <Icon name="calendar" size={14} color="var(--accent)" />
                  <span style={{ fontSize:12, color:'var(--accent-text)', fontWeight:700 }}>
                    Cada año el {form.annualDay} de {MONTHS_NAMES[form.annualMonth-1]}
                  </span>
                </div>
              </div>
            )}
          </div>

          {/* ── RECORDATORIO ── */}
          <div style={secCard}>
            <div style={lbl}>
              <span style={{ display:'flex', alignItems:'center', gap:6 }}>
                <Icon name="bell" size={13} color="var(--t5)" /> Recordatorio
              </span>
            </div>
            <div style={{ display:'flex', gap:8 }}>
              {REMINDERS.map(r => (
                <button key={r.value} type="button" onClick={() => setF(f=>({...f,reminder:r.value}))}
                  style={{
                    flex:1, padding:'9px 4px', borderRadius:'var(--r-md)', cursor:'pointer',
                    fontSize:12, fontWeight:700, textAlign:'center', transition:'all 0.15s',
                    background: form.reminder===r.value ? 'var(--accent)' : 'var(--surface)',
                    color:      form.reminder===r.value ? '#fff' : 'var(--t3)',
                    border:     `1.5px solid ${form.reminder===r.value ? 'var(--accent)' : 'var(--border)'}`,
                    boxShadow:  form.reminder===r.value ? 'var(--sh-fab)' : 'none',
                  }}>
                  {r.label}
                </button>
              ))}
            </div>
          </div>

          {/* Categoría */}
          <div style={secCard}>
            <div style={lbl}>Categoría</div>
            <div style={{ display:'flex', alignItems:'center', gap:10 }}>
              <CategoryIcon category={form.category} size="sm" />
              <select value={form.category} onChange={e=>setF(f=>({...f,category:e.target.value}))}
                style={{ ...rawInput, cursor:'pointer', fontSize:14, fontWeight:600 }}>
                {CATS.map(c => <option key={c} value={c}>{c}</option>)}
              </select>
              <Icon name="chevronDown" size={15} color="var(--t5)" />
            </div>
          </div>

          {/* ── FRASE RESUMEN ── */}
          {summaryPhrase && (
            <div style={{ background:'var(--surface-2)', border:'1.5px solid var(--border)', borderRadius:'var(--r-lg)', padding:'14px 16px', marginBottom:16, display:'flex', alignItems:'flex-start', gap:10 }}>
              <div style={{ width:32,height:32,borderRadius:'var(--r-md)',background:'var(--accent-muted)',display:'flex',alignItems:'center',justifyContent:'center',flexShrink:0 }}>
                <Icon name="sparkles" size={15} color="var(--accent)" />
              </div>
              <p style={{ fontSize:13, color:'var(--t2)', lineHeight:1.6, margin:0 }}>
                {summaryPhrase}
              </p>
            </div>
          )}

          {/* Botón */}
          <button onClick={submit} className="btn btn-primary btn-full" style={{ borderRadius:'var(--r-lg)', padding:15, fontSize:15 }}>
            <Icon name="checkCircle" size={18} color="#fff" /> Guardar gasto fijo
          </button>
        </div>
      </div>

      {/* Currency Picker reutilizado */}
      {showCurrencyPicker && (
        <CurrencyPicker
          value={form.currency}
          onChange={c => setF(f=>({...f,currency:c}))}
          onClose={() => setShowCurrencyPicker(false)}
        />
      )}

      {showIconPicker && (
        <IconPicker
          value={form.iconName}
          onChange={ic => setF(f=>({...f,iconName:ic}))}
          onClose={() => setShowIconPicker(false)}
        />
      )}
    </>
  );
};

/* ── Pantalla principal ── */
const CalendarView = ({ data, setData, theme, toggleTheme, selectedMonth, setSelectedMonth }) => {
  const [showAdd,     setShowAdd]     = useStCal(false);
  const [activeTab,   setActiveTab]   = useStCal('upcoming');

  const { fixedExpenses = [], fxRates = DEFAULT_FX_RATES, settings } = data;
  const baseCurrency = settings?.currency || 'ARS';
  const curMonth = selectedMonth || `${new Date().getFullYear()}-${String(new Date().getMonth()+1).padStart(2,'0')}`;
  const todayKey = `${new Date().getFullYear()}-${String(new Date().getMonth()+1).padStart(2,'0')}`;
  const isCurrentMonth = curMonth === todayKey;

  // Solicitar notificaciones
  useEffectCal(() => {
    if ('Notification' in window && Notification.permission === 'default') {
      Notification.requestPermission();
    }
  }, []);

  // El FAB central del bottom-nav mobile dispara este evento contextual
  useEffectCal(() => {
    const handler = (e) => { if (e.detail === 'fixed') setShowAdd(true); };
    window.addEventListener('rumbo:openAdd', handler);
    return () => window.removeEventListener('rumbo:openAdd', handler);
  }, []);

  const handleAdd = (fe) => {
    const updated = { ...data, fixedExpenses: [...fixedExpenses, fe] };
    setData(updated); saveData(updated);
  };
  const handleToggle = (id) => {
    const updated = { ...data, fixedExpenses: fixedExpenses.map(f => f.id===id?{...f,active:!f.active}:f) };
    setData(updated); saveData(updated);
  };
  const handleDelete = (id) => {
    const updated = { ...data, fixedExpenses: fixedExpenses.filter(f => f.id!==id) };
    setData(updated); saveData(updated);
    window.showToast('Gasto fijo eliminado');
  };

  // Calcular urgencia
  const withUrgency = useMemoCAL(() =>
    fixedExpenses.map(f => ({
      ...f,
      daysUntil: getDaysUntilDue(f.dueDay),
      monthlyARS: convertToBase(f.amount * (FREQUENCIES[f.frequency||'mensual']?.multiplier||1), f.currency, fxRates, baseCurrency),
    })).sort((a,b) => a.daysUntil - b.daysUntil)
  , [fixedExpenses, fxRates, baseCurrency]);

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

  const upcoming  = withUrgency.filter(f => f.active && f.daysUntil <= 10);
  const allActive = withUrgency.filter(f => f.active);
  const inactive  = withUrgency.filter(f => !f.active);

  // Vencimientos del mes seleccionado — para navegación temporal
  const monthDuesItems = useMemoCAL(() => {
    const items = [];
    fixedExpenses.filter(f => f.active).forEach(f => {
      const dates = (typeof getDueDatesInMonth === 'function')
        ? getDueDatesInMonth(f, curMonth)
        : [];
      dates.forEach(date => items.push({ fixed: f, date, amount: f.amount }));
    });
    return items.sort((a,b) => a.date - b.date);
  }, [fixedExpenses, curMonth]);
  const monthDuesTotal = monthDuesItems.reduce((s,i) =>
    s + convertToBase(i.amount, i.fixed.currency, fxRates, baseCurrency), 0);

  const urgencyConfig = (days) => {
    if (days <= 0)  return { cls:'u-red',    label:'Vence hoy',           color:'var(--danger)',  labelColor:'var(--danger-text)' };
    if (days === 1) return { cls:'u-red',    label:'Mañana',              color:'var(--danger)',  labelColor:'var(--danger-text)' };
    if (days <= 3)  return { cls:'u-red',    label:'En unos días',        color:'var(--danger)',  labelColor:'var(--danger-text)' };
    if (days <= 7)  return { cls:'u-yellow', label:'Esta semana',         color:'var(--warning)', labelColor:'var(--warning-text)' };
    if (days <= 10) return { cls:'u-green',  label:'La semana que viene', color:'var(--success)', labelColor:'var(--success-text)' };
    return                 { cls:'u-green',  label:'Próximamente',        color:'var(--success)', labelColor:'var(--success-text)' };
  };

  const FixedRow = ({ f, showUrgency = false }) => {
    const urg = urgencyConfig(f.daysUntil);
    const curInfo = SUPPORTED_CURRENCIES.find(c=>c.code===f.currency)||SUPPORTED_CURRENCIES[0];
    return (
      <div style={{
        display:'flex', alignItems:'center', gap:12, padding:'13px 16px',
        borderBottom:'1px solid var(--border)', opacity:f.active?1:0.5,
        transition:'background 0.15s',
      }}
      onMouseEnter={e=>e.currentTarget.style.background='var(--surface-2)'}
      onMouseLeave={e=>e.currentTarget.style.background=''}>
        {/* Semáforo */}
        {showUrgency && (
          <div style={{ display:'flex', flexDirection:'column', alignItems:'center', gap:3, width:12 }}>
            <div className={`urgency-dot ${urg.cls}`} />
          </div>
        )}

        {/* Icono */}
        <div style={{ width:38, height:38, borderRadius:'var(--r-md)', background:'var(--surface-2)', border:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
          <Icon name={f.iconName || f.icon || 'package'} size={18} color="var(--t3)" strokeWidth={1.7} />
        </div>

        {/* Info */}
        <div style={{ flex:1, minWidth:0 }}>
          <div style={{ fontSize:14, fontWeight:600, color:'var(--t1)', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{f.name}</div>
          <div style={{ display:'flex', alignItems:'center', gap:6, marginTop:3 }}>
            <span style={{ fontSize:11, color:'var(--t4)' }}>{FREQUENCIES[f.frequency||'mensual']?.label}</span>
            <span style={{ fontSize:11, color:'var(--t5)' }}>·</span>
            <span style={{ fontSize:11, color:'var(--t4)' }}>{f.category}</span>
            {showUrgency && (
              <span style={{ fontSize:11, fontWeight:700, color:urg.labelColor, background:f.active?'transparent':'none' }}>
                · {urg.label}
              </span>
            )}
          </div>
        </div>

        {/* Monto */}
        <div style={{ textAlign:'right', flexShrink:0 }}>
          <div style={{ fontSize:14, fontWeight:800, color:'var(--t1)', fontVariantNumeric:'tabular-nums' }}>
            {curInfo.symbol}{f.amount.toLocaleString('es-AR')}
          </div>
          {f.currency !== baseCurrency && (
            <div style={{ fontSize:11, color:'var(--t4)' }}>≈ {fmt(f.monthlyARS)}/mes</div>
          )}
        </div>

        {/* Toggle + delete */}
        <div style={{ display:'flex', gap:6, flexShrink:0 }}>
          <button onClick={()=>handleToggle(f.id)}
            style={{ width:30, height:30, borderRadius:'var(--r-md)', background:f.active?'var(--success-bg)':'var(--surface-2)', border:`1px solid ${f.active?'rgba(5,150,105,0.25)':'var(--border)'}`, display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer' }}>
            <Icon name={f.active?'checkCircle':'lock'} size={14} color={f.active?'var(--success)':'var(--t5)'} />
          </button>
          <button onClick={()=>handleDelete(f.id)}
            style={{ width:30, height:30, borderRadius:'var(--r-md)', background:'none', border:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer', opacity:0.4, transition:'opacity 0.15s' }}
            onMouseEnter={e=>e.currentTarget.style.opacity=1}
            onMouseLeave={e=>e.currentTarget.style.opacity=0.4}>
            <Icon name="trash" size={14} color="var(--danger)" />
          </button>
        </div>
      </div>
    );
  };

  return (
    <div style={{ background:'var(--bg)', minHeight:'100%', paddingBottom:32 }}>

      {/* Header */}
      <div className="screen-header">
        <div>
          <h1 className="screen-title">Gastos fijos</h1>
          <p className="screen-sub">{allActive.length} activos · {fmt(totalMonthly)}/mes</p>
        </div>
        <div style={{ display:'flex', gap:8, flexWrap:'wrap', justifyContent:'flex-end' }}>
          {setSelectedMonth && (
            <MonthSwitcher value={curMonth} onChange={setSelectedMonth} transactions={data.transactions || []} compact />
          )}
          {toggleTheme && (
            <button className="theme-toggle" onClick={toggleTheme}>
              <Icon name={theme==='dark'?'sun':'moon'} size={15} color="var(--t3)" />
            </button>
          )}
        </div>
      </div>

      <div style={{ padding:'14px 20px 0' }}>

        {/* Vencimientos del mes seleccionado — solo cuando NO es el mes actual */}
        {!isCurrentMonth && monthDuesItems.length > 0 && (
          <div style={{
            background:'var(--surface)', border:'1.5px solid var(--border)',
            borderRadius:'var(--r-xl)', padding:'16px 18px', marginBottom:14, boxShadow:'var(--sh-sm)',
          }}>
            <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:12 }}>
              <div>
                <div style={{ fontSize:11, fontWeight:700, color:'var(--t5)', textTransform:'uppercase', letterSpacing:'0.4px', marginBottom:2 }}>
                  {curMonth > todayKey ? 'Te toca pagar en' : 'Te tocó pagar en'}
                </div>
                <div style={{ fontSize:14, fontWeight:700, color:'var(--t1)' }}>
                  {(() => { const [y,m]=curMonth.split('-').map(Number); const lbl=new Date(y,m-1,1).toLocaleDateString('es-AR',{month:'long',year:'numeric'}); return lbl.charAt(0).toUpperCase()+lbl.slice(1); })()}
                </div>
              </div>
              <div style={{ textAlign:'right' }}>
                <div style={{ fontSize:22, fontWeight:900, color:'var(--danger)', fontVariantNumeric:'tabular-nums', letterSpacing:'-0.5px' }}>
                  {fmt(monthDuesTotal)}
                </div>
                <div style={{ fontSize:11, color:'var(--t5)' }}>{monthDuesItems.length} vencimientos</div>
              </div>
            </div>
            <div style={{ display:'flex', flexDirection:'column', gap:6 }}>
              {monthDuesItems.map((it, i) => (
                <div key={i} style={{ display:'flex', alignItems:'center', gap:10, padding:'8px 10px', background:'var(--surface-2)', border:'1px solid var(--border)', borderRadius:'var(--r-md)' }}>
                  <div style={{ width:32, height:32, borderRadius:'var(--r-sm)', background:'var(--surface)', border:'1px solid var(--border)', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
                    <Icon name={it.fixed.iconName || 'package'} size={14} color="var(--t3)" strokeWidth={1.7} />
                  </div>
                  <div style={{ flex:1, minWidth:0 }}>
                    <div style={{ fontSize:13, fontWeight:700, color:'var(--t1)', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{it.fixed.name}</div>
                    <div style={{ fontSize:11, color:'var(--t5)' }}>
                      {it.date.toLocaleDateString('es-AR', { weekday:'short', day:'numeric', month:'short' })} · {it.fixed.category}
                    </div>
                  </div>
                  <div style={{ fontSize:13, fontWeight:800, color:'var(--t1)', fontVariantNumeric:'tabular-nums', flexShrink:0 }}>
                    {fmtFull(it.amount, it.fixed.currency)}
                  </div>
                </div>
              ))}
            </div>
          </div>
        )}

        {/* Resumen total */}
        <div style={{
          background:'linear-gradient(135deg, var(--surface) 0%, var(--surface-2) 100%)',
          border:'1px solid var(--border)', borderRadius:'var(--r-xl)',
          padding:'16px 20px', marginBottom:14, boxShadow:'var(--sh-sm)',
          display:'flex', alignItems:'center', justifyContent:'space-between',
        }}>
          <div>
            <div style={{ fontSize:12, color:'var(--t4)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.4px', marginBottom:5 }}>Total mensual fijos</div>
            <div style={{ fontSize:28, fontWeight:900, color:'var(--danger)', letterSpacing:'-0.8px', fontVariantNumeric:'tabular-nums' }}>{fmt(totalMonthly)}</div>
          </div>
          <div style={{ display:'flex', gap:12 }}>
            {[
              { v:upcoming.filter(f=>f.daysUntil<=3).length, l:'Urgentes', cls:'u-red' },
              { v:upcoming.filter(f=>f.daysUntil>3).length,  l:'Esta semana', cls:'u-yellow' },
              { v:inactive.length, l:'Pausados', cls:'u-gray' },
            ].map(({ v, l, cls }) => (
              <div key={l} style={{ textAlign:'center' }}>
                <div style={{ display:'flex', alignItems:'center', justifyContent:'center', gap:5, marginBottom:3 }}>
                  <div className={`urgency-dot ${cls}`} />
                  <span style={{ fontSize:16, fontWeight:900, color:'var(--t1)' }}>{v}</span>
                </div>
                <div style={{ fontSize:10, color:'var(--t5)', fontWeight:600 }}>{l}</div>
              </div>
            ))}
          </div>
        </div>

        {/* Tabs */}
        <div className="pill-tabs" style={{ marginBottom:14 }}>
          {[
            ['upcoming','Próximos','bell'],
            ['all','Todos',null],
            ['inactive','Pausados',null],
          ].map(([v,l,ic]) => (
            <button key={v} className={`pill-tab${activeTab===v?' active':''}`} onClick={() => setActiveTab(v)}
              style={{ display:'inline-flex', alignItems:'center', justifyContent:'center', gap:6 }}>
              {ic && <Icon name={ic} size={13} color={activeTab===v?'var(--t1)':'var(--t4)'} strokeWidth={1.8} />}
              {l}
            </button>
          ))}
        </div>

        {/* Próximos vencimientos */}
        {activeTab === 'upcoming' && (
          <>
            {upcoming.length === 0 ? (
              <div className="insight good">
                <div className="insight-icon" style={{ background:'var(--success-bg)' }}>
                  <Icon name="checkCircle" size={20} color="var(--success)" />
                </div>
                <div>
                  <div style={{ fontSize:13, fontWeight:700, color:'var(--success-text)' }}>Todo en orden</div>
                  <div style={{ fontSize:12, color:'var(--t3)', marginTop:3 }}>No tenés vencimientos en los próximos 10 días.</div>
                </div>
              </div>
            ) : (
              <>
                {/* Leyenda semáforo */}
                <div style={{ display:'flex', gap:16, marginBottom:12, padding:'0 4px' }}>
                  {[
                    {cls:'u-red',l:'Inminente'},
                    {cls:'u-yellow',l:'Esta semana'},
                    {cls:'u-green',l:'Próximas semanas'},
                  ].map(({cls,l}) => (
                    <div key={l} style={{ display:'flex', alignItems:'center', gap:5 }}>
                      <div className={`urgency-dot ${cls}`} style={{ width:8, height:8, animation:'none' }} />
                      <span style={{ fontSize:11, color:'var(--t4)' }}>{l}</span>
                    </div>
                  ))}
                </div>

                <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:'var(--r-lg)', overflow:'hidden', boxShadow:'var(--sh-sm)' }}>
                  {upcoming.map(f => <FixedRow key={f.id} f={f} showUrgency={true} />)}
                </div>
              </>
            )}
          </>
        )}

        {/* Todos los activos */}
        {activeTab === 'all' && (
          <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:'var(--r-lg)', overflow:'hidden', boxShadow:'var(--sh-sm)' }}>
            {allActive.length === 0
              ? <div style={{ padding:'40px 20px', textAlign:'center', color:'var(--t5)', fontSize:13 }}>Sin gastos fijos activos</div>
              : allActive.map(f => <FixedRow key={f.id} f={f} showUrgency={false} />)
            }
          </div>
        )}

        {/* Pausados */}
        {activeTab === 'inactive' && (
          <div style={{ background:'var(--surface)', border:'1px solid var(--border)', borderRadius:'var(--r-lg)', overflow:'hidden', boxShadow:'var(--sh-sm)' }}>
            {inactive.length === 0
              ? <div style={{ padding:'40px 20px', textAlign:'center', color:'var(--t5)', fontSize:13 }}>No hay gastos pausados</div>
              : inactive.map(f => <FixedRow key={f.id} f={f} showUrgency={false} />)
            }
          </div>
        )}
      </div>

      {/* FAB persistente */}
      <button className="fab fab-fixed" onClick={() => setShowAdd(true)} aria-label="Agregar gasto fijo">
        <Icon name="plus" size={22} color="#fff" strokeWidth={2} />
      </button>

      {showAdd && <AddFixedDrawer onClose={()=>setShowAdd(false)} onAdd={handleAdd} fxRates={fxRates} data={data} />}
    </div>
  );
};

Object.assign(window, { CalendarView });
