#pragma once

// text_editor — wrapper PIMPL sobre ImGuiColorTextEdit (vendor MIT).
// API en namespace fn:: que oculta el tipo concreto del vendor.
//
// Uso tipico:
//   auto* ed = fn::text_editor_create(fn::CodeLang::GLSL);
//   fn::text_editor_set_text(ed, "void main() { gl_FragColor = vec4(1); }");
//   if (fn::text_editor_render(ed, "##ed", {600, 400})) { /* cambio */ }
//   fn::text_editor_destroy(ed);
//
// El estado vive en TextEditorState (forward-declared), no se expone TextEditor del vendor.

#include "imgui.h"

namespace fn {

enum class CodeLang {
    Generic,
    GLSL,
    SQL,
    Cpp,
};

// Forward declaration — definicion completa en text_editor.cpp (PIMPL).
struct TextEditorState;

// Crea un editor con el lenguaje dado. El caller es dueno y debe llamar destroy.
TextEditorState* text_editor_create(CodeLang lang = CodeLang::Generic);

// Libera el editor. Acepta nullptr (no-op).
void text_editor_destroy(TextEditorState* state);

// Reemplaza el texto del editor.
void text_editor_set_text(TextEditorState* state, const char* text);

// Devuelve el texto actual. El puntero es valido solo hasta la siguiente llamada
// a text_editor_set_text/get_text/render sobre el mismo editor.
const char* text_editor_get_text(TextEditorState* state);

// Renderiza el editor. Devuelve true en el frame en que el contenido cambio.
bool text_editor_render(TextEditorState* state, const char* label, ImVec2 size);

// True si el editor esta marcado como "dirty" (modificado desde el ultimo clear).
bool text_editor_is_dirty(const TextEditorState* state);

// Limpia el flag dirty (tipicamente tras guardar a disco).
void text_editor_clear_dirty(TextEditorState* state);

} // namespace fn
