#pragma once // dod_evidence_panel_helpers — logica pura, sin ImGui. // Tests (cpp/tests/test_dod_evidence_panel.cpp) linkan SOLO este archivo // para validar conteos, lookup y mapeo de status -> icon/color. #include #include #include #include namespace fn_viz { struct DodItem { std::string id; std::string kind; // screenshot|log|url|cmd std::string expected; bool required = true; std::string status; // pending|done|validated|failed }; struct DodEvidence { std::string item_id; std::string kind; std::string payload_path; // screenshot/log std::string payload_url; // url std::string payload_text; // cmd output int64_t attached_at = 0; bool validated = false; std::string validated_by; }; struct DodPanelState { std::vector items; std::vector evidences; std::string run_id; std::function on_validate; std::function on_reject; }; namespace dod_panel { struct StatusCounts { int total = 0; int pending = 0; int done = 0; int validated = 0; int failed = 0; int missing_required = 0; // required + no evidence + status != done/validated }; // Cuenta items por status. Si un item required NO tiene evidence y su status // no es done/validated, suma missing_required. StatusCounts count_status(const DodPanelState& state); // Busca la primera evidence cuyo item_id == item_id. nullptr si no existe. const DodEvidence* find_evidence(const DodPanelState& state, const std::string& item_id); // Status -> icon key (uso interno; en render se mapea a TI_*). // pending -> "circle-dashed" // done -> "circle-dot" // validated -> "circle-check" // failed -> "circle-x" // otro -> "circle-dashed" std::string status_icon_id(const std::string& status); // Status -> color token. // 0 = neutral (pending / desconocido) // 1 = info (done) // 2 = success (validated) // 3 = danger (failed) int status_color_token(const std::string& status); } // namespace dod_panel } // namespace fn_viz