#include "detection_decode.hpp"
#include <cassert>
#include <limits>

extern "C" int fire_decode(const float* boxes, const float* logits, float* output) {
    auto values=contextra::decodeDetections(boxes,logits,300,1280,720,{},true);
    for(size_t i=0;i<values.size();++i){
        const auto& d=values[i];
        output[i*6]=d.classId;output[i*6+1]=d.score;output[i*6+2]=d.left;
        output[i*6+3]=d.top;output[i*6+4]=d.width;output[i*6+5]=d.height;
    }
    return static_cast<int>(values.size());
}

#ifdef FIRE_TEST_MAIN
int main() {
    using namespace contextra;
    TensorContract c{true,true,{1,300,4},{1,300,3},1};
    assert(validateFireTensorContract(c));assert(!validateTensorContract(c));
    c.labelsDims={1,300,91};assert(!validateFireTensorContract(c));
    c.labelsDims={1,300,3};c.labelsFp32=false;assert(!validateFireTensorContract(c));
    std::vector<float> boxes(1200,0.25f), logits(900,-100.f);
    logits[0]=5;logits[4]=4;logits[8]=10;
    auto d=decodeDetections(boxes.data(),logits.data(),300,1280,720,{},true);
    assert(d.size()<=300 && d[0].classId==0 && d[1].classId==1);
    for(auto x:d)assert(x.classId==0 || x.classId==1);
    for(auto& x:boxes)x=std::numeric_limits<float>::quiet_NaN();
    assert(decodeDetections(boxes.data(),logits.data(),300,1280,720,{},true).empty());
}
#endif
