#pragma once
#include "imgui.h"

// Design tokens — identidad visual unica para todas las apps C++ del registry.
// Alineados 1:1 con @fn_library (Mantine v9 dark + indigo primary).
// Ver cpp/DESIGN_SYSTEM.md para la especificacion completa.
//
// Equivalencias frontend -> C++:
//   createTheme({ primaryColor: 'indigo', primaryShade: {dark:4},
//                 defaultRadius: 'md', defaultColorScheme: 'dark' })
// se corresponde con los valores de este header.

namespace fn_tokens {

namespace colors {
    // Primary — Mantine indigo (primaryShade dark = 4)
    // indigo.4 = #748FFC   indigo.5 = #5C7CFA   indigo.6 = #4C6EF5   indigo.7 = #4263EB
    constexpr ImVec4 primary        {0.298f, 0.431f, 0.961f, 1.0f}; // indigo.6 (base)
    constexpr ImVec4 primary_hover  {0.361f, 0.486f, 0.980f, 1.0f}; // indigo.5
    constexpr ImVec4 primary_light  {0.455f, 0.561f, 0.988f, 1.0f}; // indigo.4 (dark mode accent)
    constexpr ImVec4 primary_active {0.259f, 0.388f, 0.922f, 1.0f}; // indigo.7

    // Semantic — colores Mantine oficiales
    constexpr ImVec4 success {0.251f, 0.753f, 0.341f, 1.0f}; // green.6  #40C057
    constexpr ImVec4 warning {0.980f, 0.690f, 0.020f, 1.0f}; // yellow.6 #FAB005
    constexpr ImVec4 error   {0.980f, 0.322f, 0.322f, 1.0f}; // red.6    #FA5252
    constexpr ImVec4 info    {0.133f, 0.545f, 0.902f, 1.0f}; // blue.6   #228BE6

    // Surfaces — escala dark Mantine (oscuro a claro: dark.9 -> dark.0)
    constexpr ImVec4 bg            {0.102f, 0.106f, 0.118f, 1.0f}; // dark.7 #1A1B1E  body bg
    constexpr ImVec4 surface       {0.145f, 0.149f, 0.169f, 1.0f}; // dark.6 #25262B  Paper/Card
    constexpr ImVec4 surface_hover {0.173f, 0.180f, 0.200f, 1.0f}; // dark.5 #2C2E33
    constexpr ImVec4 surface_active{0.216f, 0.227f, 0.251f, 1.0f}; // dark.4 #373A40

    // Border
    constexpr ImVec4 border        {0.216f, 0.227f, 0.251f, 1.0f}; // dark.4 #373A40
    constexpr ImVec4 border_strong {0.361f, 0.373f, 0.400f, 1.0f}; // dark.3 #5C5F66

    // Text (escala dark inversa: dark.0 mas claro)
    constexpr ImVec4 text       {0.757f, 0.761f, 0.773f, 1.0f}; // dark.0  #C1C2C5  texto primario
    constexpr ImVec4 text_muted {0.565f, 0.573f, 0.588f, 1.0f}; // dark.2  #909296  subtitulos
    constexpr ImVec4 text_dim   {0.361f, 0.373f, 0.400f, 1.0f}; // dark.3  #5C5F66  disabled
}

// Spacing — adaptado para ImGui (densidad mayor que CSS).
// Mantine usa 10/12/16/20/32 px, aqui densificamos al estilo TUI clasico.
namespace spacing {
    constexpr float xs = 4.0f;
    constexpr float sm = 8.0f;
    constexpr float md = 12.0f;
    constexpr float lg = 16.0f;
    constexpr float xl = 24.0f;
}

// Radius — mapeo directo Mantine (defaultRadius: 'md' = 8px).
namespace radius {
    constexpr float none = 0.0f;
    constexpr float xs = 2.0f;
    constexpr float sm = 4.0f;
    constexpr float md = 8.0f;   // default para Paper/Card/Button/Input
    constexpr float lg = 12.0f;
    constexpr float xl = 16.0f;
}

namespace font_size {
    constexpr float xs  = 10.0f;
    constexpr float sm  = 12.0f;
    constexpr float md  = 14.0f; // default
    constexpr float lg  = 18.0f;
    constexpr float xl  = 24.0f;
    constexpr float xxl = 32.0f;
}

// Aplica la identidad visual al ImGuiStyle y a los estilos de ImPlot (si
// esta enlazado). Se invoca automaticamente desde fn::run_app() (app_base.h)
// salvo que AppConfig::theme sea ImGuiDark/ImGuiLight/None.
// Idempotente: se puede llamar varias veces sin efectos secundarios.
// No desactiva ninguna feature de ImGui (docking, viewports, etc).
void apply_dark_theme();

} // namespace fn_tokens
