#pragma once

#include <nvdsmeta.h>
#include <glib.h>

namespace contextra {
// PARSER-CUTOVER-01: 성공0도 구분하는 SDK UserMetadata JSON 계약.
inline NvDsMetaType completionMetaType() {
    return nvds_get_user_meta_type(const_cast<char*>("CONTEXTRA.RFDETR.FRAME_COMPLETED.V1"));
}
inline gpointer copyCompletion(gpointer data, gpointer) {
    auto* meta = static_cast<NvDsUserMeta*>(data);
    return g_strdup(static_cast<const gchar*>(meta->user_meta_data));
}
inline void releaseCompletion(gpointer data, gpointer) {
    auto* meta = static_cast<NvDsUserMeta*>(data);
    g_free(meta->user_meta_data);
    meta->user_meta_data = nullptr;
}
inline bool publishCompletion(NvDsBatchMeta* batch, NvDsFrameMeta* frame,
                              guint component, guint count, guint width, guint height) {
    auto* meta = nvds_acquire_user_meta_from_pool(batch);
    if (!meta) return false;
    meta->user_meta_data = g_strdup_printf(
        "{\"schema\":1,\"component\":%u,\"frame\":%d,\"pts\":%" G_GUINT64_FORMAT
        ",\"count\":%u,\"width\":%u,\"height\":%u,\"status\":\"completed\"}",
        component, frame->frame_num, frame->buf_pts, count, width, height);
    meta->base_meta.meta_type = completionMetaType();
    meta->base_meta.copy_func = copyCompletion;
    meta->base_meta.release_func = releaseCompletion;
    nvds_add_user_meta_to_frame(frame, meta);
    return true;
}
}
