#pragma once

#include <cstdint>
#include <string>

struct GraphData;

namespace ge {

// Persistencia de posiciones de nodos en `graph_explorer.db` (SQLite junto al
// exe). Una unica tabla:
//
//   layouts(graph_hash TEXT, node_id TEXT, x REAL, y REAL,
//           pinned INTEGER, updated_at INTEGER,
//           PRIMARY KEY(graph_hash, node_id))
//
// `graph_hash` se calcula a partir del path absoluto del input (operations.db
// o similar). Mismo input → mismas posiciones recuperables. `node_id` es
// el `user_data` del nodo formateado en hex (lo que `graph_load_from_operations`
// rellena con el FNV1a del id de la BD origen).

// Devuelve un hash estable del path canonico. 0 si path es null/vacio.
uint64_t compute_graph_hash(const char* path);

// Asegura que la BD existe y la tabla esta creada. Devuelve true en exito.
bool layout_store_open(const char* db_path);
void layout_store_close();

// Guarda las posiciones (y NF_PINNED) de todos los nodos del grafo bajo la
// clave `graph_hash`. UPSERT por (graph_hash, node_id). Devuelve el numero
// de filas escritas (>= 0). En error, devuelve -1.
int layout_store_save(uint64_t graph_hash, const GraphData& graph);

// Aplica las posiciones guardadas al grafo. Recorre los nodos y, para cada
// uno cuyo `user_data` exista en la tabla con el hash dado, sobrescribe
// `x`, `y`, y los flags `NF_PINNED`. Nodos sin entrada se quedan tal cual.
// Devuelve el numero de nodos actualizados.
int layout_store_load(uint64_t graph_hash, GraphData& graph);

} // namespace ge
