// Micara bridge — client API (login 1×, heartbeat, version) — Node/Electron pur
// fetch global (Electron 43 / Node 22). Erreurs → ApiError avec status HTTP.
class ApiError extends Error {
  constructor(message, status) {
    super(message);
    this.status = status;
  }
}

function createApi({ serverUrl, token, timeoutMs = 8000, fetchImpl = globalThis.fetch }) {
  const base = String(serverUrl || '').replace(/\/+$/, '');

  async function request(path, opts = {}) {
    const ctrl = new AbortController();
    const timer = setTimeout(() => ctrl.abort(), timeoutMs);
    try {
      const res = await fetchImpl(base + path, {
        method: opts.method || 'GET',
        signal: ctrl.signal,
        headers: {
          'Content-Type': 'application/json',
          ...(token ? { Authorization: `Bearer ${token}` } : {}),
          ...(opts.headers || {}),
        },
        body: opts.body ? JSON.stringify(opts.body) : undefined,
      });
      const data = await res.json().catch(() => ({}));
      if (!res.ok) throw new ApiError(data.error || `HTTP ${res.status}`, res.status);
      return data;
    } finally {
      clearTimeout(timer);
    }
  }

  return {
    // login 1× : échange email+mdp contre un jeton api longue durée
    login: (email, password) => request('/api/bridge/login', { method: 'POST', body: { email, password } }),
    // valide le jeton stocké au lancement (jeton mort → écran de login)
    me: () => request('/api/me'),
    // version publiée du bridge (auto-update au lancement)
    latest: () => request('/api/bridge/latest'),
    // présence : si le Mac dort ou l'app est fermée, plus de heartbeat →
    // le dashboard alerte « bridge endormi / app fermée »
    heartbeat: (extra = {}) => request('/api/bridge/heartbeat', { method: 'POST', body: extra }),
    // device activation (t_ec4c7c04) : échange du ticket du bouton « Lancer »
    // (micara://open?link=…) contre un jeton api longue durée. Le ticket EST
    // le credential (l'app n'a pas encore de jeton) — usage unique, 5 min,
    // jamais loggé côté serveur.
    consumeLink: (ticket) => request('/api/bridge/consume-link', { method: 'POST', body: { link: ticket } }),
  };
}

module.exports = { createApi, ApiError };
