#include "core/text_input.h"
#include "core/tokens.h"
#include <imgui.h>
#include <cstdio>

namespace fn_ui {

bool text_input(const char* label, char* buf, size_t buf_size,
                const char* placeholder) {
    using namespace fn_tokens;

    // Label muted arriba
    ImGui::PushStyleColor(ImGuiCol_Text, colors::text_muted);
    ImGui::TextUnformatted(label);
    ImGui::PopStyleColor();

    // Input con estilo tokens
    ImGui::PushStyleColor(ImGuiCol_FrameBg,        colors::bg);
    ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, colors::surface_hover);
    ImGui::PushStyleColor(ImGuiCol_FrameBgActive,  colors::surface);
    ImGui::PushStyleColor(ImGuiCol_Border,         colors::border);
    ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding,  radius::sm);
    ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
    ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,  ImVec2(spacing::sm, spacing::xs + 2.0f));

    char id[160];
    std::snprintf(id, sizeof(id), "##%s", label);
    ImGui::SetNextItemWidth(-FLT_MIN); // full width

    ImGuiInputTextFlags flags = ImGuiInputTextFlags_None;
    bool changed = false;
    if (placeholder && *placeholder && buf[0] == '\0') {
        // Mostrar placeholder en text_dim cuando vacio: ImGui no tiene API
        // oficial; dibujamos el hint por encima si el buffer esta vacio.
        ImVec2 cur = ImGui::GetCursorScreenPos();
        changed = ImGui::InputText(id, buf, buf_size, flags);
        ImDrawList* dl = ImGui::GetWindowDrawList();
        const ImVec4 dim = colors::text_dim;
        const ImU32 col = ImGui::ColorConvertFloat4ToU32(dim);
        dl->AddText(ImVec2(cur.x + spacing::sm,
                           cur.y + (spacing::xs + 2.0f)),
                    col, placeholder);
    } else {
        changed = ImGui::InputText(id, buf, buf_size, flags);
    }

    ImGui::PopStyleVar(3);
    ImGui::PopStyleColor(4);
    return changed;
}

} // namespace fn_ui
