#ifndef TFLITE_TFLITE_BINDINGS_H
#define TFLITE_TFLITE_BINDINGS_H

#pragma once

#include "tensorflow/lite/c/c_api.h"
#include "tensorflow/lite/c/common.h"
#include "tensorflow/lite/core/api/tensor_utils.h"
#include "tflite_status.h"

static ERL_NIF_TERM tflite_printInterpreterState(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    if (argc != 1) return enif_make_badarg(env);

    ERL_NIF_TERM interpreter_nif = argv[0];
    erlang_nif_res<tflite::Interpreter *> * interpreter_res;
    if (enif_get_resource(env, interpreter_nif, erlang_nif_res<tflite::Interpreter *>::type, (void **)&interpreter_res)) {
        if (interpreter_res->val) {
            tflite::PrintInterpreterState(interpreter_res->val);
            return erlang::nif::atom(env, "nil");
        } else {
            return erlang::nif::error(env, "invalid resource");
        }
    } else {
        return erlang::nif::error(env, "cannot access resource");
    }
}

static ERL_NIF_TERM tflite_resetVariableTensor(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    if (argc != 1) return enif_make_badarg(env);

    ERL_NIF_TERM tensor_nif = argv[0];
    erlang_nif_res<TfLiteTensor *> *self_res;
    if (enif_get_resource(env, tensor_nif, erlang_nif_res<TfLiteTensor *>::type, (void **) &self_res)) {
        if (self_res->val) {
            TfLiteStatus status = tflite::ResetVariableTensor(self_res->val);
            return tflite_status_to_erl_term(env, status);
        } else {
            return erlang::nif::error(env, "invalid resource");
        }
    } else {
        return erlang::nif::error(env, "cannot access resource");
    }
}

#endif // TFLITE_TFLITE_BINDINGS_H
