/* =========================================================
   NOVA X — api.js
   Carga y caché de datos (productos.json / categorias.json)
   ========================================================= */

const NovaAPI = (() => {
  let productosCache = null;
  let categoriasCache = null;

  async function getProductos() {
    if (productosCache) return productosCache;
    try {
      const res = await fetch(`${window.NOVAX_CONFIG?.API_URL || "api"}/productos`, { credentials: "include" });
      if (!res.ok) throw new Error("No se pudo cargar productos desde la API");
      productosCache = await res.json();
      return productosCache;
    } catch (err) {
      console.error("[NovaAPI] Error cargando productos:", err);
      return [];
    }
  }

  async function getCategorias() {
    if (categoriasCache) return categoriasCache;
    try {
      const res = await fetch(`${window.NOVAX_CONFIG?.API_URL || "api"}/categorias`, { credentials: "include" });
      if (!res.ok) throw new Error("No se pudo cargar categorías desde la API");
      categoriasCache = await res.json();
      return categoriasCache;
    } catch (err) {
      console.error("[NovaAPI] Error cargando categorías:", err);
      return [];
    }
  }

  async function getProductoPorId(id) {
    const productos = await getProductos();
    return productos.find((p) => p.id === id) || null;
  }

  async function getRelacionados(producto, limite = 4) {
    const productos = await getProductos();
    return productos
      .filter((p) => p.categoria === producto.categoria && p.id !== producto.id)
      .slice(0, limite);
  }

  return { getProductos, getCategorias, getProductoPorId, getRelacionados };
})();

/* ---------- Utilidades generales ---------- */
const NovaUtils = (() => {
  function formatoPrecio(valor) {
    return "S/ " + Number(valor).toFixed(2);
  }

  function generarEstrellas(rating) {
    const llenas = Math.round(rating);
    let html = "";
    for (let i = 1; i <= 5; i++) {
      html += i <= llenas ? "★" : "☆";
    }
    return html;
  }

  function getParam(nombre) {
    const params = new URLSearchParams(window.location.search);
    return params.get(nombre);
  }

  function debounce(fn, delay = 250) {
    let timer;
    return (...args) => {
      clearTimeout(timer);
      timer = setTimeout(() => fn(...args), delay);
    };
  }

  return { formatoPrecio, generarEstrellas, getParam, debounce };
})();
