/* MIRAI — Autenticación contra el backend
 *
 * Las credenciales se validan SIEMPRE en el servidor (/api/login), que devuelve
 * un token firmado. El navegador nunca conoce contraseñas, hashes ni a qué
 * planilla está asociada cada cuenta: solo guarda un token opaco.
 *
 * authenticate() es asíncrona: devuelve { user, token } o null.
 */

// Único punto de verificación de credenciales: delega en el backend.
// Devuelve { user, token } si las credenciales son válidas, o null si no.
async function authenticate(username, password) {
  const u = (username || "").trim();
  try {
    const res = await fetch("/api/login", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ user: u, pass: password }),
    });
    if (!res.ok) return null;
    const data = await res.json();
    if (!data || !data.token) return null;
    return { user: data.user, token: data.token };
  } catch (e) {
    return null;
  }
}

// ============ SESIÓN ============
const MIRAI_SESSION_KEY = "mirai_session";

// Token de la sesión actual (para Authorization: Bearer en las llamadas al backend).
function miraiSessionToken() {
  try { return (JSON.parse(localStorage.getItem(MIRAI_SESSION_KEY)) || {}).token || null; }
  catch (e) { return null; }
}

function useAuth() {
  const [session, setSession] = React.useState(() => {
    try { return JSON.parse(localStorage.getItem(MIRAI_SESSION_KEY)) || null; }
    catch (e) { return null; }
  });
  const login = (username, token) => {
    const s = { user: username, token: token || null };
    localStorage.setItem(MIRAI_SESSION_KEY, JSON.stringify(s));
    setSession(s);
  };
  const logout = () => {
    localStorage.removeItem(MIRAI_SESSION_KEY);
    setSession(null);
  };
  return { session, login, logout };
}

Object.assign(window, { authenticate, useAuth, miraiSessionToken });
