// api.jsx — Cliente HTTP del módulo mayorista.
// Token JWT compartido con /portal vía localStorage (ss_dashboard_token / ss_dashboard_user).

const TOKEN_KEY = 'ss_dashboard_token';
const USER_KEY = 'ss_dashboard_user';

class ApiError extends Error {
  constructor(status, message) {
    super(message);
    this.name = 'ApiError';
    this.status = status;
  }
}

function getStoredToken() {
  try { return localStorage.getItem(TOKEN_KEY) || ''; } catch { return ''; }
}

function getStoredUser() {
  try { return JSON.parse(localStorage.getItem(USER_KEY) || 'null'); } catch { return null; }
}

function storeSession(token, user) {
  try {
    localStorage.setItem(TOKEN_KEY, token);
    localStorage.setItem(USER_KEY, JSON.stringify(user));
  } catch {}
}

function clearSession() {
  try {
    localStorage.removeItem(TOKEN_KEY);
    localStorage.removeItem(USER_KEY);
  } catch {}
}

// apiFetch('/api/auth/me') — lanza ApiError con el mensaje del envelope {error}.
// En 401 con token guardado: limpia la sesión y notifica vía evento 'ss:logout'.
async function apiFetch(path, { method = 'GET', body, auth = true } = {}) {
  const headers = { 'Content-Type': 'application/json' };
  const token = auth ? getStoredToken() : '';
  if (token) headers['Authorization'] = 'Bearer ' + token;

  let res;
  try {
    res = await fetch(API_BASE + path, {
      method,
      headers,
      body: body !== undefined ? JSON.stringify(body) : undefined,
    });
  } catch {
    throw new ApiError(0, 'network');
  }

  let data = null;
  try { data = await res.json(); } catch {}

  if (res.status === 401 && token) {
    clearSession();
    window.dispatchEvent(new Event('ss:logout'));
  }
  if (!res.ok) {
    throw new ApiError(res.status, (data && data.error) || 'Error del servidor');
  }
  return data;
}

// Token de captcha invisible para formularios públicos (patrón de shared.jsx).
async function getCaptchaToken() {
  try {
    const data = await apiFetch('/api/public/captcha', { auth: false });
    return (data && data.token) || '';
  } catch { return ''; }
}

// ---------- Ajustes públicos (WhatsApp, dirección, email) ----------
// Editables desde /portal/admin → Ajustes. Un solo fetch por sesión (la ruta
// vive bajo el rate-limit de formularios) y defaults si la API no responde.
const PUBLIC_SETTINGS_DEFAULTS = {
  whatsapp_number: '15148677519',
  company_email: 'info@sensstyle.com',
  company_address: "9033a Rue De L'Aiglon, Saint-Léonard, QC · Canada",
};
let _settingsPromise = null;
let _settingsValue = { ...PUBLIC_SETTINGS_DEFAULTS };

function fetchPublicSettings() {
  if (!_settingsPromise) {
    _settingsPromise = apiFetch('/api/public/settings', { auth: false }).then(d => {
      for (const k of Object.keys(PUBLIC_SETTINGS_DEFAULTS)) {
        if (d && d[k]) _settingsValue[k] = d[k];
      }
      return _settingsValue;
    }).catch(() => { _settingsPromise = null; return _settingsValue; });
  }
  return _settingsPromise;
}

function usePublicSettings() {
  const [s, setS] = React.useState(_settingsValue);
  React.useEffect(() => {
    let alive = true;
    fetchPublicSettings().then(v => { if (alive) setS({ ...v }); });
    return () => { alive = false; };
  }, []);
  return s;
}

Object.assign(window, { apiFetch, ApiError, getCaptchaToken, getStoredToken, getStoredUser, storeSession, clearSession, fetchPublicSettings, usePublicSettings });
