#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 <string>
#include <vector>
#include <functional>
#include <cstdint>

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<DodItem>     items;
    std::vector<DodEvidence> evidences;
    std::string run_id;
    std::function<void(const std::string& item_id)> on_validate;
    std::function<void(const std::string& item_id)> 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
