// Live data adapter for the auto_coin terminal.
//
// 디자인 원본은 mock TICKERS / STRATEGIES / ORDERS_SEED / AUDIT_SEED 를 export 했지만,
// 운영 환경에서는 백엔드(/api/terminal/snapshot)가 실제 봇 상태를 돌려준다.
// 여기서는 포맷 헬퍼와 fetch 래퍼, 그리고 컴포넌트가 참조하는 전역 컨테이너만 노출한다.
// 전역(TICKERS, STRATEGIES, ORDERS_SEED, AUDIT_SEED)은 useBotState 폴링이 매번 갱신한다.

const krw = (n) => Number(n || 0).toLocaleString('en-US', { maximumFractionDigits: 0 });
const krwSigned = (n) => {
  const v = Number(n || 0);
  return (v >= 0 ? '+' : '') + v.toLocaleString('en-US', { maximumFractionDigits: 0 });
};
const pct = (n, digits = 2) => {
  const v = Number(n || 0);
  return (v >= 0 ? '+' : '') + v.toFixed(digits) + '%';
};
const fmtPx = (n) => {
  const v = Number(n || 0);
  if (v >= 1_000) return v.toLocaleString('en-US', { maximumFractionDigits: 0 });
  if (v >= 1) return v.toLocaleString('en-US', { maximumFractionDigits: 1 });
  return v.toLocaleString('en-US', { maximumFractionDigits: 4 });
};
const sigQty = (n) => {
  const v = Number(n || 0);
  if (v === 0) return '—';
  if (v < 0.01) return v.toFixed(5);
  if (v < 1) return v.toFixed(4);
  if (v < 100) return v.toFixed(3);
  return v.toFixed(2);
};

// 디자인이 globals 로 참조하는 컨테이너 — 폴링이 매 사이클 덮어씀.
window.TICKERS = [];
window.STRATEGIES = [];
window.ORDERS_SEED = [];
window.AUDIT_SEED = [];
window.WEBHOOKS_SEED = [];

const AC_CONFIG = window.AC_CONFIG || {
  csrfToken: '',
  pollIntervalMs: 5000,
  snapshotUrl: '/api/terminal/snapshot',
  controlUrl: '/api/terminal/control',
};

async function apiGet(path) {
  const res = await fetch(path, { credentials: 'same-origin' });
  if (!res.ok) throw new Error(`GET ${path} → ${res.status}`);
  return res.json();
}

async function apiPost(path, body) {
  const res = await fetch(path, {
    method: 'POST',
    credentials: 'same-origin',
    headers: {
      'Content-Type': 'application/json',
      'X-CSRF-Token': AC_CONFIG.csrfToken || '',
    },
    body: JSON.stringify(body || {}),
  });
  if (!res.ok) {
    let detail = '';
    try { detail = (await res.json()).detail || ''; } catch (_) { /* empty */ }
    throw new Error(`POST ${path} → ${res.status} ${detail}`);
  }
  return res.json();
}

Object.assign(window, {
  AC_CONFIG, apiGet, apiPost,
  krw, krwSigned, pct, fmtPx, sigQty,
});
