#ifndef QNN_ERROR_HPP
#define QNN_ERROR_HPP

#include <erl_nif.h>

#include "QnnCommon.h"
#include "nif_utils.hpp"
#include "qnn_api.hpp"

// Build {:error, {:qnn, code, message}} from a QNN error handle.
// The message comes from errorGetMessage when the backend provides it.
inline ERL_NIF_TERM qnn_error_term(ErlNifEnv *env, const QnnApi &api, Qnn_ErrorHandle_t err) {
    uint32_t code = static_cast<uint32_t>(err & 0xFFFF'FFFF);

    const char *message = nullptr;
    if (api.fn.errorGetMessage) {
        api.fn.errorGetMessage(err, &message);
    }

    ERL_NIF_TERM detail = enif_make_tuple3(
        env,
        enif_make_atom(env, "qnn"),
        enif_make_uint(env, code),
        erlang::nif::make_binary(env, message ? message : ""));
    return erlang::nif::error(env, detail);
}

#endif // QNN_ERROR_HPP
