// Person_detection quant model
// MlModel struct initialization to include model I/O info.
// Bytecode loading, input/output processes.

#include <springbok.h>

#include "iree/base/api.h"
#include "iree/hal/api.h"
#include "samples/util/util.h"
#include "person_detection.h"

// Compiled module embedded here to avoid file IO:
#if !defined(BUILD_EMITC)
#include "samples/quant_model/person_detection_bytecode_module_static.h"
#include "samples/quant_model/person_detection_bytecode_module_static_c.h"
#else
#include "samples/quant_model/person_detection_c_module_static_c.h"
#include "samples/quant_model/person_detection_c_module_static_emitc.h"
#endif
#include "samples/quant_model/person_detection_quant_input_c.h"

const MlModel kModel = {
    .num_input = 1,
    .num_input_dim = {4},
    .input_shape = {{1, 96, 96, 1}},
    .input_length = {96 * 96 * 1},
    .input_size_bytes = {sizeof(int8_t)},
    .num_output = 1,
    .output_length = {2},
    .output_size_bytes = sizeof(int8_t),
    .hal_element_type = IREE_HAL_ELEMENT_TYPE_SINT_8,
    .entry_func = "module.main",
    .model_name = "person_detection_quant",
};

PersonDetectionOutput detection;

iree_status_t create_module(iree_vm_module_t **module) {
#if !defined(BUILD_EMITC)
  const struct iree_file_toc_t *module_file_toc =
      samples_quant_model_person_detection_bytecode_module_static_create();
  return iree_vm_bytecode_module_create(
      iree_make_const_byte_span(module_file_toc->data, module_file_toc->size),
      iree_allocator_null(), iree_allocator_system(), module);
#else
  return module_create(iree_allocator_system(), module);
#endif
}

const iree_hal_executable_library_header_t **library_query(
    iree_hal_executable_library_version_t max_version, void *reserved) {
#if !defined(BUILD_EMITC)
  return person_detection_bytecode_module_static_linked_llvm_library_query(
      max_version,
      /*reserved=*/reserved);
#else
  return person_detection_c_module_static_linked_llvm_library_query(
      max_version,
      /*reserved=*/reserved);
#endif
}

iree_status_t load_input_data(const MlModel *model, void **buffer,
                              iree_byte_span_t **byte_span) {
  byte_span[0] = malloc(sizeof(iree_byte_span_t));
  *byte_span[0] =
      iree_make_byte_span(person_detection_quant_input,
                          model->input_size_bytes[0] * model->input_length[0]);
  return iree_ok_status();
}

iree_status_t process_output(const MlModel *model,
                             iree_hal_buffer_mapping_t *buffers,
                             MlOutput *output) {
  iree_status_t result = iree_ok_status();
  int8_t *data = (int8_t *)buffers[0].contents.data;
  detection.non_person_score = data[0];
  detection.person_score = data[1];

  LOG_INFO("Output: Non-person Score: %d; Person Score: %d",
           detection.non_person_score, detection.person_score);
  output->result = &detection;
  output->len = sizeof(detection);

  return result;
}
