#pragma once
#include <cstdint>

// Atlas de iconos Tabler para `graph_renderer`. Bakea N codepoints (0xE000-
// 0xFCFF) en una textura RGBA 512×512 organizada como grid de 16×16 celdas
// de 32 px cada una. Cada icono se rasteriza con `stb_truetype` desde
// `tabler-icons.ttf`. La textura se sube a GPU como `GL_RGBA8` con filtrado
// linear.
//
// Convencion de IDs: `icon_id = 0` significa "sin icono". Las regiones
// devueltas por `graph_icons_build` tienen `id = i + 1`, donde `i` es la
// posicion del codepoint en el array de entrada. De esta forma un nodo o un
// EntityType con `icon_id == 0` (default tras `graph_node`/`entity_type`) se
// pinta sin icono superpuesto.

struct IconAtlas;

struct IconRegion {
    uint16_t id;             // 1-based; 0 reservado para "sin icono"
    uint16_t codepoint;      // codepoint Unicode original (debug)
    float    u0, v0, u1, v1; // UVs en [0,1] dentro del atlas
};

// Construye el atlas. `count` puede ser 1..256 (limite del grid 16×16).
// `icon_px` controla el tamano de rasterizacion; tipicamente 32 para grid de
// 32 px sin re-escalado.
//
// Devuelve `nullptr` si no encuentra `tabler-icons.ttf` o si `count` esta
// fuera de rango. El TTF se busca en (en orden):
//   1. `./tabler-icons.ttf`
//   2. `./assets/tabler-icons.ttf`
//   3. `$FN_ASSETS_DIR/tabler-icons.ttf`
//   4. `${FN_CPP_ROOT}/vendor/tabler-icons/tabler-icons.ttf`
//
// Requiere un contexto OpenGL valido en el hilo actual (sube la textura).
IconAtlas* graph_icons_build(const uint16_t* codepoints, int count, int icon_px = 32);

// GL texture id (RGBA8) — lo consume `graph_renderer` como `samplerBuffer u_icon_atlas`.
unsigned int graph_icons_texture(const IconAtlas*);

// Devuelve la region por icon_id (1-based). nullptr si fuera de rango.
const IconRegion* graph_icons_region(const IconAtlas*, uint16_t icon_id);

// Numero de iconos cargados.
int graph_icons_count(const IconAtlas*);

// Dimensiones del atlas en pixels (siempre 512×512 actualmente).
int graph_icons_width(const IconAtlas*);
int graph_icons_height(const IconAtlas*);

// Acceso al bitmap RGBA en CPU (para tests / debug). Layout: row-major,
// `width * height * 4` bytes. NULL si el atlas se construyo sin retener
// pixels (por defecto se retienen para tests).
const unsigned char* graph_icons_pixels(const IconAtlas*);

// Tabla plana de UVs lista para subir como uniform array al shader. Layout:
// `count * 4` floats consecutivos (u0, v0, u1, v1) en el orden de
// codepoints pasado a `_build` (0-indexed: el icono con `icon_id == k`
// vive en `uv_table[(k-1)*4 .. (k-1)*4 + 4]`).
const float* graph_icons_uv_table(const IconAtlas*);

void graph_icons_destroy(IconAtlas*);
