#pragma once

#include <functional>

// Settings globales de app (persistente entre runs) + ventana flotante de
// settings con secciones core + registrables por la app.
//
// Lifecycle:
//   - settings_load()                        ← run_app al inicio
//   - app de forma opcional: settings_window_add_section(...) en el init
//   - app_menubar() incluye el MenuItem "Settings..." que abre la ventana
//   - settings_window_render()               ← run_app al final del frame
//   - settings_save()                        ← run_app al exit (ademas de auto-save al mutar)

namespace fn_ui {

enum class FontId : int {
    Karla       = 0,
    Roboto      = 1,
    DroidSans   = 2,
    Cousine     = 3,
    ProggyClean = 4,
};

struct AppSettings {
    bool   show_fps     = false;
    FontId font_id      = FontId::DroidSans;  // legibilidad solida a 15 px
    float  font_size_px = 15.0f;
};

// Estado vivo. Cualquier codigo puede leer/mutar.
AppSettings& settings();

// I/O persistencia (cwd/app_settings.ini). Llamadas por run_app.
void settings_load();
void settings_save();

// Atlas dirty flag — solo se levanta cuando cambia font_id (rebuild necesario).
// Cambios de font_size_px NO marcan dirty: run_app aplica style.FontSizeBase
// cada frame, y ImGui 1.92+ escala el atlas dinamicamente sin rebuild.
void settings_mark_font_dirty();
bool settings_consume_font_dirty();

// Filename y label de cada FontId (para el combo de la ventana y para que
// icon_font sepa que TTF cargar). FontId::ProggyClean devuelve "" — el caller
// debe usar AddFontDefault().
const char* font_filename(FontId id);
const char* font_label(FontId id);

// === Ventana de settings ===

// Abre/cierra/toggle. El bool subyacente lo gestiona el modulo.
bool  settings_window_is_open();
void  settings_window_set_open(bool v);
void  settings_window_toggle();

// MenuItem componible para una MainMenuBar. Llama dentro de un
// BeginMainMenuBar() exitoso. Click → abre la ventana. Returns true si el
// usuario clico (la ventana se mostrara al final del frame).
//
// Por defecto, app_menubar() ya invoca este MenuItem — las apps no necesitan
// llamarlo a mano salvo que monten su propia menubar custom.
bool settings_window_menu_item(const char* label = "Settings...");

// Registra una seccion extra que la ventana renderiza debajo de las core.
// `id` debe ser estable (usado para deduplicar registros entre llamadas).
// `render` se invoca dentro de un CollapsingHeader abierto por defecto.
//
// Patron tipico (call once en init de la app):
//
//   fn_ui::settings_window_add_section("shader_compiler", "Shader compiler",
//       []{
//           ImGui::Checkbox("Auto-compile on save", &g_auto_compile);
//           ImGui::SliderInt("Debounce (ms)", &g_debounce_ms, 50, 2000);
//       });
//
// La app es responsable de persistir su propio estado (su SQLite, archivo
// propio, etc). Los settings core (fuente / fps) se guardan automaticamente
// en app_settings.ini.
void settings_window_add_section(const char* id, const char* title,
                                 std::function<void()> render);

// Render de la ventana entera. Si !is_open, no-op. Llamada por run_app al
// final del frame, despues del render_fn de la app.
void settings_window_render();

} // namespace fn_ui
