#include "demo.h"
#include "core/tokens.h"
#include <cstdio>

namespace gallery {

void demo_header(const char* name, const char* version, const char* description) {
    using namespace fn_tokens;

    ImGui::SetWindowFontScale(1.4f);
    ImGui::TextUnformatted(name);
    ImGui::SetWindowFontScale(1.0f);

    ImGui::SameLine();
    ImGui::PushStyleColor(ImGuiCol_Text, colors::text_dim);
    ImGui::Text("  %s", version);
    ImGui::PopStyleColor();

    if (description && *description) {
        ImGui::PushStyleColor(ImGuiCol_Text, colors::text_muted);
        ImGui::TextWrapped("%s", description);
        ImGui::PopStyleColor();
    }
    ImGui::Separator();
    ImGui::Dummy(ImVec2(0, spacing::sm));
}

void section(const char* title) {
    using namespace fn_tokens;
    ImGui::Dummy(ImVec2(0, spacing::sm));
    ImGui::PushStyleColor(ImGuiCol_Text, colors::text_muted);
    ImGui::TextUnformatted(title);
    ImGui::PopStyleColor();
    ImGui::Separator();
    ImGui::Dummy(ImVec2(0, spacing::xs));
}

void variant_label(const char* text) {
    ImGui::PushStyleColor(ImGuiCol_Text, fn_tokens::colors::text_dim);
    ImGui::TextUnformatted(text);
    ImGui::PopStyleColor();
}

void code_block(const char* code) {
    using namespace fn_tokens;
    ImGui::Dummy(ImVec2(0, spacing::sm));
    ImGui::PushStyleColor(ImGuiCol_Text, colors::text_dim);
    ImGui::TextUnformatted("// example");
    ImGui::PopStyleColor();

    ImGui::PushStyleColor(ImGuiCol_ChildBg, colors::bg);
    ImGui::PushStyleColor(ImGuiCol_Border,  colors::border);
    ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding,   radius::sm);
    ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 1.0f);
    ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding,   ImVec2(spacing::md, spacing::sm));

    // Altura: aprox lineas * line-height
    int lines = 1;
    for (const char* p = code; *p; ++p) if (*p == '\n') ++lines;
    float h = lines * ImGui::GetTextLineHeightWithSpacing() + spacing::md;

    char id[32];
    std::snprintf(id, sizeof(id), "##code_%p", (const void*)code);
    ImGui::BeginChild(id, ImVec2(0, h),
                      ImGuiChildFlags_Borders,
                      ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
    ImGui::PushStyleColor(ImGuiCol_Text, colors::text);
    ImGui::TextUnformatted(code);
    ImGui::PopStyleColor();
    ImGui::EndChild();

    ImGui::PopStyleVar(3);
    ImGui::PopStyleColor(2);
}

} // namespace gallery
