// ════════════ MONEY · Banking state store ════════════
// Module-level reactive store so balances survive remounts / navigation
// (resets on full page reload — clean slate each session).

window.PXBank = (function () {
  const seed = {
    accounts: [
      { id: 'op',   name: 'Operating',   tail: '4290', type: 'Business checking',       balance: 12408.22, current: 12559.83, icon: 'briefcase', tone: 'spark', routing: '021000021', acct: '480021664290' },
      { id: 'tax',  name: 'Tax reserve', tail: '5512', type: 'Auto-reserve · 18%',      balance: 3820.00,  current: 3820.00,  icon: 'shield',    tone: 'sky',   routing: '021000021', acct: '480021665512' },
      { id: 'save', name: 'Savings',     tail: '7733', type: 'Treasury · 4.10% APY',     balance: 8100.00,  current: 8100.00,  icon: 'trendUp',   tone: 'sage',  routing: '021000021', acct: '480021667733' },
    ],
    activity: [
      { id: 'a1', acct: 'op',   dir: 'in',    desc: 'Shopify payout',            sub: 'Deposit · Operating',          amt: 842.30,  date: 'Today',  status: 'settled' },
      { id: 'a2', acct: 'op',   dir: 'sweep', desc: 'Auto tax sweep · 18%',      sub: 'Operating → Tax reserve',      amt: -151.61, date: 'Today',  status: 'settled' },
      { id: 'a3', acct: 'op',   dir: 'in',    desc: 'Square · in-store sales',   sub: 'Deposit · Operating',          amt: 1240.50, date: 'Mar 11', status: 'settled' },
      { id: 'a4', acct: 'op',   dir: 'out',   desc: 'Card ••4290 · King Arthur', sub: 'Ingredients',                  amt: -340.00, date: 'Mar 11', status: 'settled' },
      { id: 'a5', acct: 'save', dir: 'in',    desc: 'Interest earned',           sub: 'Savings',                      amt: 27.43,   date: 'Mar 10', status: 'settled' },
      { id: 'a6', acct: 'op',   dir: 'out',   desc: 'Weekly transfer to Savings',sub: 'Operating → Savings',          amt: -500.00, date: 'Mar 10', status: 'settled' },
      { id: 'a7', acct: 'op',   dir: 'out',   desc: 'Con Edison · electricity',  sub: 'Utilities',                    amt: -218.40, date: 'Mar 9',  status: 'settled' },
    ],
    recipients: [
      { id: 'r1', name: 'King Arthur Baking', detail: 'Vendor · ACH ••8842',  tail: '8842', kind: 'vendor', method: 'ACH', last: 'Paid $340 · Mar 11' },
      { id: 'r2', name: 'Greenpoint Rent LLC', detail: 'Landlord · ACH ••1120', tail: '1120', kind: 'vendor', method: 'ACH', last: 'Paid $3,200 · Mar 1' },
      { id: 'r3', name: 'Rosa Kim',            detail: 'Team · ACH ••3390',    tail: '3390', kind: 'person', method: 'ACH', last: 'Paid $1,840 · Mar 7' },
      { id: 'r4', name: 'Con Edison',          detail: 'Utility · ACH ••5567',  tail: '5567', kind: 'vendor', method: 'ACH', last: 'Paid $218 · Mar 9' },
    ],
    approvals: [
      { id: 'ap1', who: 'Rosa Kim', to: 'King Arthur Baking', amt: 412.00, note: 'Flour restock · next week', when: '20 min ago' },
    ],
    transfers: [
      { id: 't1', t: 'Auto tax sweep', d: '18% of every deposit → Tax reserve', when: 'On each deposit', icon: 'shield',   tone: 'sky',     on: true },
      { id: 't2', t: 'Weekly savings', d: '$500 → Savings',                      when: 'Every Monday',    icon: 'trendUp',  tone: 'sage',    on: true },
      { id: 't3', t: 'Rent',           d: '$3,200 → Greenpoint Rent LLC',        when: '1st of month',    icon: 'building', tone: 'neutral', on: true },
    ],
    // forthcoming cash events (used by the forecast) — relative to Operating
    upcoming: [
      { id: 'u1', when: 'Mar 14', label: 'Payroll · 4 people',       amt: -5856.00 },
      { id: 'u2', when: 'Mar 16', label: 'Greenpoint invoice #1026', amt: 2400.00 },
      { id: 'u3', when: 'Mar 18', label: 'King Arthur · flour',      amt: -340.00 },
      { id: 'u4', when: 'Mar 20', label: 'Con Edison',               amt: -218.40 },
      { id: 'u5', when: 'Mar 24', label: 'Expected card payouts',    amt: 1650.00 },
      { id: 'u6', when: 'Apr 1',  label: 'Rent',                     amt: -3200.00 },
    ],
    card: { frozen: false, revealed: false, dailyLimit: 5000, spentMonth: 1842.30 },
    // Mercury-shaped credit (charge) card + instantly-issued virtual cards
    credit: { id: 'cc', name: 'Pexxie Credit', last4: '2208', network: 'Visa', exp: '09/28', balance: 1284.40, limit: 15000, statementDue: 'Apr 3', cashbackMonth: 42.18, cashbackRate: 1.5, autopay: true, frozen: false },
    virtual: [
      { id: 'v1', name: 'Google Ads',      last4: '7731', tone: 'sky',  spent: 420.00, limit: 800,  owner: 'Priya V.',  frozen: false },
      { id: 'v2', name: 'Software & SaaS', last4: '5520', tone: 'plum', spent: 312.97, limit: 500,  owner: 'Amara O.',  frozen: false },
      { id: 'v3', name: 'Contractor · Diego', last4: '9012', tone: 'sage', spent: 0,    limit: 1200, owner: 'Diego T.', frozen: true },
    ],
  };

  let state = JSON.parse(JSON.stringify(seed));
  const subs = new Set();
  const r2 = (n) => Math.round(n * 100) / 100;

  return {
    get: () => state,
    subscribe: (fn) => { subs.add(fn); return () => subs.delete(fn); },
    set: (updater) => {
      state = typeof updater === 'function' ? updater(state) : { ...state, ...updater };
      subs.forEach(f => f());
    },
    acct: (id) => state.accounts.find(a => a.id === id),
    round: r2,
  };
})();

window.useBank = function () {
  const [, force] = React.useReducer(x => x + 1, 0);
  React.useEffect(() => window.PXBank.subscribe(force), []);
  return window.PXBank.get();
};

// signed money: -1420 -> "−$1,420.00", 842.3 -> "+$842.30"
window.signed = function (n) {
  const s = window.money(Math.abs(n));
  return (n < 0 ? '−' : '+') + s;
};
