#pragma once

// sql_workbench — componente ImGui que combina text_editor (SQL) + table_view
// + sidebar de schema + historial. Ejecuta queries contra una sqlite3*
// proporcionada por el caller (no se cierra desde el componente).
//
// Uso tipico:
//   sqlite3* db = nullptr;
//   sqlite3_open_v2("registry.db", &db, SQLITE_OPEN_READONLY, nullptr);
//   fn::SqlWorkbenchState st;
//   st.readonly = true;
//   ...
//   fn::sql_workbench("##sql", db, st, ImVec2(-1, -1));
//
// Backend (`sql_workbench_run_query`) es testeable por separado contra una DB
// en memoria.

#include "imgui.h"

#include <string>
#include <vector>

struct sqlite3;

namespace fn {

struct SqlWorkbenchState {
    std::string query        = "SELECT name FROM sqlite_master WHERE type='table';";
    std::string last_error;
    std::vector<std::string>              columns;
    std::vector<std::vector<std::string>> rows;
    std::vector<std::string>              history;
    bool   readonly      = false;
    int    truncated_at  = 10000;
    bool   truncated     = false;
    double last_ms       = 0.0;

    // Internals (PIMPL-lite — el caller no necesita tocar esto).
    void* _editor        = nullptr;  // fn::TextEditorState*
    bool  _editor_synced = false;
    bool  _show_history  = false;
    std::vector<std::string> _schema_tables;
    std::vector<std::string> _schema_views;
    bool  _schema_loaded = false;
};

// Ejecuta `sql` contra `db` y rellena state.columns/rows/last_error/last_ms.
// Devuelve true si la query se ejecuto sin error. Aplica readonly check.
// Cap de filas a state.truncated_at (state.truncated indica si se trunco).
bool sql_workbench_run_query(sqlite3* db, const char* sql, SqlWorkbenchState& state);

// Lee el schema de la DB (sqlite_master) y rellena state._schema_tables/_views.
void sql_workbench_load_schema(sqlite3* db, SqlWorkbenchState& state);

// Renderiza el componente. La DB debe existir mientras se renderiza. Si
// db == nullptr, dibuja un empty state.
void sql_workbench(const char* id, sqlite3* db, SqlWorkbenchState& state, ImVec2 size = {-1, -1});

// Libera el editor interno (llamar al cerrar la app si la state es global).
void sql_workbench_destroy(SqlWorkbenchState& state);

} // namespace fn
