#pragma once
// data_table_color_rules — editor de reglas de color por columna + aplicacion.
// Sub-funcion extraida de modules/data_table/data_table.cpp.
// Issue 0107c. Wave de refactor para partir el god-file 4777 LOC.
//
// Responsabilidad: helpers estaticos de color (parse_hex_color, resolve_categorical_dot_color,
// apply_color_rules_for_cell, auto_categorical_color) + UI del submenu "Conditional color"
// dentro del header-menu de columnas.
//
// Dependencias: data_table_types.h (ColorRule, ColorRuleKind, State).
//               imgui.h, core/icons_tabler.h.
// NO depende de UiState global — recibe el draft state que necesita por referencia.

#include "core/data_table_types.h"
#include "imgui.h"
#include <string>
#include <unordered_map>

namespace data_table {

// ---------------------------------------------------------------------------
// Helpers de color (pure/static, no ImGui state).
// ---------------------------------------------------------------------------

// auto_categorical_color: palette determinista de 12 colores para un valor
// string. Mismo valor -> mismo color siempre. v1.5.0.
ImU32 auto_categorical_color(const char* value, float alpha = 1.0f);

// resolve_categorical_dot_color: busca en dot_map de la regla; fallback a
// auto_categorical_color si no hay match.
ImU32 resolve_categorical_dot_color(const ColorRule& cr, const char* value);

// parse_hex_color: "#rrggbb" / "#rrggbbaa" -> ImU32 con alpha explicitamente.
// Fallback a gris IM_COL32(128,128,128,255) en error.
ImU32 parse_hex_color(const std::string& hex, float alpha = 1.0f);

// apply_color_rules_for_cell: aplica todas las ColorRules para la columna `c`
// ANTES del renderer de celda. Llama ImGui::TableSetBgColor para CellBg,
// dibuja dots para CategoricalDot, y pinta overlay de rango para NumericRange.
// `dot_advance_px` (out): pixeles a avanzar en x antes de texto (por dot).
// Debe llamarse justo despues de ImGui::TableSetColumnIndex, antes del renderer.
void apply_color_rules_for_cell(const State& st,
                                int c, const char* cell,
                                ImVec2 cell_min, float cell_w, float cell_h,
                                float& dot_advance_px);

// ---------------------------------------------------------------------------
// UI del editor de reglas de color (submenu dentro del header-menu de cols).
// Llamada desde draw_header_menu cuando el usuario abre "Conditional color".
// Mutates `st.color_rules` al hacer click en "Apply".
// ---------------------------------------------------------------------------

// ColorRuleEditorState: estado de draft del editor de reglas de color.
// Un ColorRuleEditorState vive en UiState (singleton por instancia de tabla).
// Guarda los drafts per-column en maps indexados por columna.
struct ColorRuleEditorState {
    // 0=CellBg, 1=CategoricalDot, 2=NumericRange — per column.
    std::unordered_map<int, int>         color_rule_kind;

    // CellBg draft per col.
    std::unordered_map<int, std::string> color_value_inputs;
    std::unordered_map<int, ImVec4>      color_picker_vals;

    // NumericRange draft per col.
    struct NumRangeDraft {
        double min   = 0.0;
        double max   = 100.0;
        float  alpha = 0.25f;
        char   c_lo[8] = "22c55e"; // green-500
        char   c_md[8] = "f59e0b"; // amber-500
        char   c_hi[8] = "ef4444"; // red-500
    };
    std::unordered_map<int, NumRangeDraft> num_range_drafts;

    // CategoricalDot draft per col.
    struct CatDotDraft {
        float alpha     = 1.0f;
        float radius_px = 4.0f;
    };
    std::unordered_map<int, CatDotDraft> cat_dot_drafts;
};

// draw_color_rule_menu: dibuja el submenu "Conditional color" para la columna
// `col`. Retorna true si el usuario hizo click en "Apply" (la regla ya fue
// anadida a st.color_rules por la funcion).
// editor_st: draft state per tabla (ColorRuleEditorState de UiState).
// col_type: tipo efectivo de la columna (para auto-seleccion de modo).
bool draw_color_rule_menu(State& st, int col, ColumnType col_type,
                          ColorRuleEditorState& editor_st);

} // namespace data_table
