#pragma once

// Tree view minimo para jerarquias tipo projects -> apps/analysis/vaults.
// API low-level (begin/end por nodo) que permite al caller construir el
// arbol con logica propia (filtrado, lazy load, etc.).
//
// Uso:
//   if (fn_ui::tree_node_begin("All", selected_id == "")) {
//       // seleccionado via click
//       if (fn_ui::tree_node_clicked()) selected_id = "";
//   }
//   fn_ui::tree_node_end();
//
//   for (const auto& p : projects) {
//       if (fn_ui::tree_branch_begin(p.id.c_str(), p.name.c_str(),
//                                    selected_id == p.id)) {
//           if (fn_ui::tree_node_clicked()) selected_id = p.id;
//
//           for (const auto& a : p.apps) {
//               fn_ui::tree_leaf(a.id.c_str(), a.name.c_str(),
//                                selected_id == a.id);
//               if (fn_ui::tree_node_clicked()) selected_id = a.id;
//           }
//           fn_ui::tree_branch_end();
//       }
//   }

namespace fn_ui {

// Hoja (sin hijos). Muestra indentacion + label. Resaltado si `selected`.
void tree_leaf(const char* id, const char* label, bool selected = false);

// Rama con hijos. Devuelve true si esta desplegada (el caller dibuja los
// hijos y llama tree_branch_end). Si devuelve false, NO llamar end.
bool tree_branch_begin(const char* id, const char* label, bool selected = false);
void tree_branch_end();

// Nodo raiz "All" / "Orphans" etc. — como leaf pero sin indentacion.
void tree_root(const char* id, const char* label, bool selected = false);

// True si el ultimo nodo (leaf/branch/root) fue clickeado este frame.
// Debe consultarse inmediatamente despues de llamar al nodo.
bool tree_node_clicked();

} // namespace fn_ui
