// ─────────────────────────────────────────────────────────────
// Moneta app store — single source of truth for interactive state.
// All screens subscribe via useAppStore(); writes via store.set().
// ─────────────────────────────────────────────────────────────

(function () {
  const listeners = new Set();
  let state = {
    // Onboarding
    kybStep: 3,                   // current active step (1..5). 6 = done.

    // Wallets
    walletCurrency: 'AED',        // selected currency in wallet detail
    wallets: {
      AED: { code:'AED', name:'UAE Dirham',    balance: 2_184_650.40, change: '+1.2%', dir:'up',   pending: 12_480, reserved: 3_920 },
      GBP: { code:'GBP', name:'British Pound', balance:   312_480.12, change: '−0.4%', dir:'down', pending:  4_200, reserved:   600 },
      USD: { code:'USD', name:'US Dollar',     balance:   486_220.00, change: '+0.6%', dir:'up',   pending:  8_120, reserved: 1_200 },
      EUR: { code:'EUR', name:'Euro',          balance:    96_410.85, change: '+0.1%', dir:'up',   pending:  1_500, reserved:   200 },
    },

    // FX flow
    fx: {
      from: 'AED',
      to:   'GBP',
      amount: '80000',          // string — what's typed
      lockedAt: null,           // ms timestamp when rate was locked
      lockSeconds: 30,
    },

    // Send flow
    sendDraft: {
      recipientId: 2,           // Sterling House Imports
      amount: '28200',
      currency: 'GBP',
      reference: 'INV-4421 · April supplies',
      method: 'SWIFT · gpi',
    },

    // Tx list
    txList: [
      { id:'TX-93021', kind:'fx',  desc:'Convert AED → GBP',     ts:'Today · 14:32',     amt:'−AED 80,000.00', sub:'+£17,144.20',  cur:'AED', status:'settled', rate: 0.21430, src:'AED', dst:'GBP', srcAmt: 80000, dstAmt: 17144.20 },
      { id:'TX-93019', kind:'out', desc:'Al Madar Logistics LLC', ts:'Today · 11:08',     amt:'−AED 42,500.00', sub:'Invoice #4421', cur:'AED', status:'settled' },
      { id:'TX-93015', kind:'in',  desc:'Sterling House Imports', ts:'Yesterday · 16:44', amt:'+£28,200.00',     sub:'Receivable',    cur:'GBP', status:'settled' },
      { id:'TX-93010', kind:'fx',  desc:'Convert USD → AED',     ts:'Yesterday · 09:12', amt:'−$15,000.00',     sub:'+AED 55,094.25',cur:'USD', status:'settled', rate: 3.6730, src:'USD', dst:'AED', srcAmt: 15000, dstAmt: 55094.25 },
      { id:'TX-93002', kind:'out', desc:'Munich Holdings GmbH',   ts:'25 Apr · 17:02',    amt:'−€8,420.00',      sub:'SEPA',          cur:'EUR', status:'pending' },
      { id:'TX-92998', kind:'in',  desc:'Etihad Aviation Group',  ts:'25 Apr · 12:30',    amt:'+AED 320,000.00', sub:'Wire',          cur:'AED', status:'settled' },
      { id:'TX-92994', kind:'fee', desc:'FX margin · 12 bps',     ts:'25 Apr · 09:12',    amt:'−AED 96.00',      sub:'Auto',          cur:'AED', status:'settled' },
      { id:'TX-92987', kind:'fx',  desc:'Convert GBP → EUR',     ts:'24 Apr · 15:48',    amt:'−£12,000.00',     sub:'+€14,034.00',   cur:'GBP', status:'settled', rate: 1.1695, src:'GBP', dst:'EUR', srcAmt: 12000, dstAmt: 14034 },
      { id:'TX-92981', kind:'in',  desc:'Acme Logistics UK Ltd',  ts:'23 Apr · 10:21',    amt:'+£42,800.00',     sub:'SWIFT',         cur:'GBP', status:'settled' },
      { id:'TX-92970', kind:'out', desc:'Dubai Tax Authority',    ts:'22 Apr · 09:00',    amt:'−AED 184,200.00', sub:'VAT Q1',        cur:'AED', status:'settled' },
    ],
    selectedTxId: 'TX-93021',

    // Tx-list filters (visual toggle only per spec)
    activityFilters: { currency: 'All', type: 'All' },

    // Settings toggles
    settings: {
      hideBalances: false,
      pushNotifications: true,
      emailNotifications: true,
      smsNotifications: false,
      faceId: true,
      twoFactor: true,
    },

    // Toast (transient message)
    toast: null,
  };

  function get() { return state; }
  function set(patch) {
    state = (typeof patch === 'function') ? patch(state) : { ...state, ...patch };
    listeners.forEach(l => l(state));
  }
  // Deep-set helper: store.update('wallets.AED.balance', 100)
  function update(path, value) {
    const keys = path.split('.');
    set(prev => {
      const next = structuredClone(prev);
      let cur = next;
      for (let i = 0; i < keys.length - 1; i++) cur = cur[keys[i]];
      cur[keys[keys.length - 1]] = value;
      return next;
    });
  }
  function subscribe(l) { listeners.add(l); return () => listeners.delete(l); }

  // FX rates (mid-market) — for live amount calc
  const RATES = {
    'AED-GBP': 0.21456, 'GBP-AED': 4.6605,
    'AED-USD': 0.27225, 'USD-AED': 3.6730,
    'AED-EUR': 0.25240, 'EUR-AED': 3.9620,
    'GBP-USD': 1.27000, 'USD-GBP': 0.78740,
    'GBP-EUR': 1.16950, 'EUR-GBP': 0.85510,
    'USD-EUR': 0.92110, 'EUR-USD': 1.08570,
  };
  function rate(from, to) {
    if (from === to) return 1;
    return RATES[`${from}-${to}`] || 1;
  }
  // Apply 12 bps margin (12/10000 = 0.0012). Rate quoted to user is slightly worse than mid.
  function quotedRate(from, to) {
    const mid = rate(from, to);
    return mid * (1 - 0.0012);
  }

  function showToast(message, ms = 2400) {
    set({ toast: { message, id: Date.now() } });
    setTimeout(() => {
      const cur = get();
      if (cur.toast && cur.toast.message === message) set({ toast: null });
    }, ms);
  }

  // React hook — re-renders on any store change
  function useAppStore(selector) {
    const [, force] = React.useReducer(x => x + 1, 0);
    React.useEffect(() => subscribe(force), []);
    return selector ? selector(state) : state;
  }

  window.appStore = { get, set, update, subscribe, rate, quotedRate, showToast };
  window.useAppStore = useAppStore;
})();
