#pragma once

#include "gfx/mesh_obj_load.h"  // fn::gfx::Mesh

#include <cstddef>

namespace fn::gfx {

// Carga el primer mesh (primera primitive del primer mesh) de un archivo GLB 2.0.
//
// Soporta:
//   - POSITION (vec3 float, obligatorio)
//   - NORMAL   (vec3 float, opcional — si falta se generan normales smooth
//               area-weighted promediando las normales de cara de cada vertice)
//   - indices  (ubyte/ushort/uint, escalares) — sin indices se interpreta como
//               lista de triangulos directa.
//
// Node transform: si el primer nodo que referencia el mesh tiene matrix o TRS,
// se aplica a posiciones y normales (normales se transforman con la inversa transpuesta).
//
// Limitaciones (documentadas):
//   - Solo GLB (binario). .gltf+.bin separado y data-URIs base64 no soportados.
//   - Solo el primer mesh / primera primitive.
//   - Sin texturas ni materiales (mesh viewer usa color uniforme).
//   - Asume buffer 0 embebido en el chunk BIN.
//
// Retorna Mesh vacio (positions.empty()) si el parse falla.
// El detalle del error esta disponible via gltf_load_last_error().
Mesh gltf_load_mesh_from_file(const char* path);

// Variante pura (salvo el buffer): parsea GLB desde un bloque de memoria.
// 'data' debe vivir al menos mientras dure la llamada.
// Retorna Mesh vacio en fallo; gltf_load_last_error() da el detalle.
Mesh gltf_load_mesh_from_memory(const unsigned char* data, size_t size);

// Descripcion del ultimo error de gltf_load_mesh_from_file /
// gltf_load_mesh_from_memory. Valida hasta la siguiente llamada a cualquiera
// de las dos funciones. Nunca retorna nullptr (puede ser "").
const char* gltf_load_last_error();

} // namespace fn::gfx
