// ---------- Money Tab Components ----------
// All data stored via parent's onSave (proven savePinItem path).
// Balance → regular item with title '::balance::', amount in memo field
// Loans → regular item with title '::loans::', JSON list in memo field
const { useState: useSM, useEffect: useEM, useRef: useRM, useMemo: useMM } = React;

const BALANCE_TITLE = '::balance::';
const LOANS_TITLE = '::loans::';

// ---- Balance Display ----
function BalanceCard({ items, onSave }) {
  const [editing, setEditing] = useSM(false);
  const [input, setInput] = useSM('');
  const inputRef = useRM(null);

  const balItem = useMM(() => (items || []).find(i => i.title === BALANCE_TITLE), [items]);
  const balance = balItem ? parseInt(balItem.memo || '0', 10) : null;

  const save = (amount) => {
    onSave({
      id: balItem?.id || uid(),
      tab: 'money', title: BALANCE_TITLE,
      memo: String(amount),
      dateISO: D.todayISO(), color: 'green',
      pinned: true, status: 'planned', tags: [],
    });
  };

  const startEdit = () => {
    setInput(balance != null ? String(balance) : '');
    setEditing(true);
    setTimeout(() => inputRef.current?.focus(), 40);
  };

  const commit = () => {
    const v = parseInt(input.replace(/[^0-9-]/g, ''), 10);
    if (!isNaN(v)) save(v);
    setEditing(false);
  };

  const fmt = (n) => n == null ? '미입력' : n.toLocaleString('ko-KR') + '원';

  return (
    <div className="bal-card">
      <span className="bal-label">잔고</span>
      {editing ? (
        <input ref={inputRef} className="bal-input" type="text" inputMode="numeric"
          value={input} onChange={(e) => setInput(e.target.value)}
          onKeyDown={(e) => { if (e.nativeEvent?.isComposing) return; if (e.key === 'Enter') commit(); if (e.key === 'Escape') setEditing(false); }}
          onBlur={commit} placeholder="잔고 입력" />
      ) : (
        <span className={'bal-amount' + (balance == null ? ' empty' : '')} onClick={startEdit}>₩ {fmt(balance)}</span>
      )}
      {!editing && <button className="bal-edit" onClick={startEdit}>수정</button>}
      <style>{`
        .bal-card{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--bg);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:8px}
        .bal-label{font-size:13px;font-weight:600;color:var(--ink-3);flex-shrink:0}
        .bal-amount{font-size:20px;font-weight:700;color:var(--ink);cursor:pointer;flex:1;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
        .bal-amount.empty{color:var(--ink-4);font-size:14px}
        .bal-input{flex:1;font-size:20px;font-weight:700;border:none;border-bottom:2px solid #059669;outline:none;background:transparent;font-family:inherit;color:var(--ink);padding:2px 0;font-variant-numeric:tabular-nums}
        .bal-edit{appearance:none;border:1px solid var(--line);background:var(--bg);padding:4px 10px;border-radius:6px;font-size:11px;font-weight:500;cursor:pointer;color:var(--ink-3);font-family:inherit;flex-shrink:0}
        .bal-edit:hover{color:var(--ink);border-color:var(--ink-4)}
      `}</style>
    </div>
  );
}

// ---- Loan Card ----
function LoanCard({ items, onSave }) {
  const [collapsed, setCollapsed] = useSM(() => localStorage.getItem('mycal.loan.collapsed') === 'true');
  const [editIdx, setEditIdx] = useSM(-1);
  const [form, setForm] = useSM({});

  const loansItem = useMM(() => (items || []).find(i => i.title === LOANS_TITLE), [items]);
  const loans = useMM(() => {
    try { return loansItem?.memo ? JSON.parse(loansItem.memo) : []; }
    catch { return []; }
  }, [loansItem]);

  const persist = (list) => {
    onSave({
      id: loansItem?.id || uid(),
      tab: 'money', title: LOANS_TITLE,
      memo: JSON.stringify(list),
      dateISO: D.todayISO(), color: 'orange',
      pinned: true, status: 'planned', tags: [],
    });
  };

  const toggle = () => {
    setCollapsed((v) => { localStorage.setItem('mycal.loan.collapsed', String(!v)); return !v; });
  };

  const startAdd = () => {
    setEditIdx(loans.length);
    setForm({ name: '', balance: '', monthly: '', rate: '', current: '', total: '' });
  };

  const startEdit = (i) => {
    setEditIdx(i);
    const l = loans[i];
    setForm({
      name: l.name || '', balance: String(l.balance || ''),
      monthly: String(l.monthly || ''), rate: String(l.rate || ''),
      current: String(l.current || ''), total: String(l.total || ''),
    });
  };

  const commitEdit = () => {
    if (!form.name.trim()) { setEditIdx(-1); return; }
    const entry = {
      name: form.name.trim(),
      balance: parseInt(form.balance.replace(/[^0-9]/g, ''), 10) || 0,
      monthly: parseInt(form.monthly.replace(/[^0-9]/g, ''), 10) || 0,
      rate: form.rate.trim(),
      current: parseInt(form.current.replace(/[^0-9]/g, ''), 10) || 0,
      total: parseInt(form.total.replace(/[^0-9]/g, ''), 10) || 0,
    };
    const next = [...loans];
    if (editIdx >= loans.length) next.push(entry);
    else next[editIdx] = entry;
    persist(next);
    setEditIdx(-1);
  };

  const removeLoan = (i) => {
    persist(loans.filter((_, j) => j !== i));
  };

  const fmt = (n) => n ? n.toLocaleString('ko-KR') : '0';

  const renderEditForm = (autoFocusName) => (
    <div className="loan-edit">
      <input className="le-in" placeholder="명칭 (예: 카카오뱅크)" value={form.name}
        onChange={(e) => setForm({...form, name: e.target.value})} autoFocus={autoFocusName} />
      <div className="le-grid">
        <label className="le-l">잔액</label>
        <input className="le-in le-num" inputMode="numeric" placeholder="0" value={form.balance}
          onChange={(e) => setForm({...form, balance: e.target.value})} />
        <label className="le-l">월 상환</label>
        <input className="le-in le-num" inputMode="numeric" placeholder="0" value={form.monthly}
          onChange={(e) => setForm({...form, monthly: e.target.value})} />
        <label className="le-l">이자율</label>
        <input className="le-in le-num" inputMode="decimal" placeholder="예: 3.5" value={form.rate}
          onChange={(e) => setForm({...form, rate: e.target.value})} />
        <label className="le-l">회차</label>
        <div className="le-row-inner">
          <input className="le-in le-sm" inputMode="numeric" placeholder="현재" value={form.current}
            onChange={(e) => setForm({...form, current: e.target.value})} />
          <span className="le-sep">/</span>
          <input className="le-in le-sm" inputMode="numeric" placeholder="전체" value={form.total}
            onChange={(e) => setForm({...form, total: e.target.value})} />
        </div>
      </div>
      <div className="le-actions">
        <button className="le-btn" onClick={() => setEditIdx(-1)}>취소</button>
        <button className="le-btn le-save" onClick={commitEdit}>저장</button>
      </div>
    </div>
  );

  return (
    <div className="loan-card">
      <button className="loan-header" onClick={toggle}>
        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
          <polyline points={collapsed ? '9 6 15 12 9 18' : '6 9 12 15 18 9'} />
        </svg>
        <span className="loan-header-t">대출 현황</span>
        {loans.length > 0 && <span className="loan-header-n">{loans.length}건</span>}
      </button>

      {!collapsed && (
        <div className="loan-body">
          {loans.map((l, i) => (
            editIdx === i ? (
              <React.Fragment key={i}>{renderEditForm(false)}</React.Fragment>
            ) : (
              <div key={i} className="loan-item" onClick={() => startEdit(i)}>
                <div className="loan-name">{l.name}</div>
                <div className="loan-detail">
                  <span>잔액 {fmt(l.balance)}</span>
                  <span>·</span>
                  <span>월 {fmt(l.monthly)}</span>
                  {l.rate && <><span>·</span><span>{l.rate}%</span></>}
                </div>
                {(l.current || l.total) ? <div className="loan-round">{l.current || 0}/{l.total || '?'}회차</div> : null}
                <button className="loan-del" onClick={(e) => { e.stopPropagation(); removeLoan(i); }} aria-label="삭제"><Icon.X size={12} /></button>
              </div>
            )
          ))}
          {editIdx === loans.length ? renderEditForm(true) : (
            <button className="loan-add" onClick={startAdd}>+ 대출 추가</button>
          )}
        </div>
      )}

      <style>{`
        .loan-card{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:8px}
        .loan-header{display:flex;align-items:center;gap:8px;padding:10px 14px;width:100%;appearance:none;border:none;background:transparent;cursor:pointer;font-family:inherit;color:var(--ink-3);transition:color .12s}
        .loan-header:hover{color:var(--ink)}
        .loan-header-t{font-size:12px;font-weight:600;letter-spacing:.02em}
        .loan-header-n{font-size:11px;color:var(--ink-4);font-weight:500}
        .loan-body{padding:0 14px 12px;display:flex;flex-direction:column;gap:8px}
        .loan-item{position:relative;padding:10px 12px;background:var(--bg-soft);border-radius:8px;cursor:pointer;transition:background .12s}
        .loan-item:hover{background:var(--accent-soft)}
        .loan-name{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:3px}
        .loan-detail{font-size:12px;color:var(--ink-3);display:flex;gap:6px;font-variant-numeric:tabular-nums;flex-wrap:wrap}
        .loan-round{font-size:11px;color:var(--ink-4);margin-top:2px}
        .loan-del{position:absolute;top:8px;right:8px;appearance:none;border:none;background:transparent;color:var(--ink-4);cursor:pointer;padding:4px;border-radius:4px;display:flex;opacity:0;transition:opacity .12s}
        .loan-item:hover .loan-del{opacity:1}
        .loan-del:hover{color:var(--ink);background:var(--accent-soft)}
        .loan-add{appearance:none;border:1px dashed var(--line);background:transparent;padding:8px;border-radius:8px;font-size:12px;color:var(--ink-3);cursor:pointer;font-family:inherit;width:100%;text-align:center}
        .loan-add:hover{border-color:var(--ink-4);color:var(--ink)}
        .loan-edit{display:flex;flex-direction:column;gap:8px;padding:12px;background:var(--bg-soft);border-radius:8px}
        .le-grid{display:grid;grid-template-columns:50px 1fr;gap:6px 8px;align-items:center}
        .le-row-inner{display:flex;align-items:center;gap:4px}
        .le-l{font-size:11px;color:var(--ink-3);font-weight:500}
        .le-in{border:1px solid var(--line);border-radius:6px;padding:7px 10px;font-size:13px;background:var(--bg);color:var(--ink);outline:none;font-family:inherit;width:100%}
        .le-in:focus{border-color:#059669}
        .le-num{font-variant-numeric:tabular-nums}
        .le-sm{flex:1;text-align:center}
        .le-sep{color:var(--ink-4);font-size:13px}
        .le-actions{display:flex;gap:6px;justify-content:flex-end;margin-top:2px}
        .le-btn{appearance:none;border:1px solid var(--line);background:var(--bg);padding:6px 14px;border-radius:6px;font-size:12px;cursor:pointer;font-family:inherit;color:var(--ink-2)}
        .le-btn:hover{color:var(--ink)}
        .le-save{background:#059669;color:#fff;border-color:#059669}
        .le-save:hover{opacity:.85}
      `}</style>
    </div>
  );
}

window.BalanceCard = BalanceCard;
window.LoanCard = LoanCard;
