// api.jsx — backend API client + auth state

const API_BASE = '/api';

const api = {
  _token: localStorage.getItem('ms_token'),

  headers() {
    const h = { 'Content-Type': 'application/json' };
    if (this._token) h['Authorization'] = `Bearer ${this._token}`;
    return h;
  },

  setToken(t) {
    this._token = t;
    if (t) localStorage.setItem('ms_token', t);
    else localStorage.removeItem('ms_token');
  },

  async request(method, path, body) {
    const opts = { method, headers: this.headers(), credentials: 'include' };
    if (body !== undefined) opts.body = JSON.stringify(body);
    const res = await fetch(API_BASE + path, opts);
    const data = await res.json().catch(() => ({}));
    if (!res.ok) throw new Error(data?.error?.message || `Request failed (${res.status})`);
    return data;
  },

  get(path)         { return this.request('GET', path); },
  post(path, body)  { return this.request('POST', path, body); },
  put(path, body)   { return this.request('PUT', path, body); },
  del(path)         { return this.request('DELETE', path); },
};

// useAuth hook — manages user state from token
function useAuth() {
  const [user, setUserState] = React.useState(null);
  const [authLoading, setAuthLoading] = React.useState(!!api._token);

  React.useEffect(() => {
    if (!api._token) { setAuthLoading(false); return; }
    api.get('/auth/me')
      .then(d => setUserState(d.user))
      .catch(() => api.setToken(null))
      .finally(() => setAuthLoading(false));
  }, []);

  const login = async (email, password) => {
    const data = await api.post('/auth/login', { email, password });
    api.setToken(data.token);
    setUserState(data.user);
    // Sync localStorage cart → server cart after login
    if (window.syncCartToServer) {
      const localCart = JSON.parse(localStorage.getItem('ms_cart_v1') || '[]');
      if (localCart.length) window.syncCartToServer(localCart);
    }
    return data.user;
  };

  const register = async (form) => {
    const data = await api.post('/auth/register', form);
    api.setToken(data.token);
    setUserState(data.user);
    // Sync localStorage cart → server cart after register
    if (window.syncCartToServer) {
      const localCart = JSON.parse(localStorage.getItem('ms_cart_v1') || '[]');
      if (localCart.length) window.syncCartToServer(localCart);
    }
    return data.user;
  };

  const logout = async () => {
    try { await api.post('/auth/logout'); } catch (_) {}
    api.setToken(null);
    setUserState(null);
  };

  return { user, authLoading, login, register, logout, setUser: setUserState };
}

window.api = api;
window.useAuth = useAuth;
