// 声明 N-API 基础函数的 FFI 绑定

///|
#borrow(result)
extern "c" fn napi_get_value_int32(
  env : NapiEnv,
  value : NapiValue,
  result : Ref[Int],
) -> Int = "napi_get_value_int32"

///|
#borrow(result)
extern "c" fn napi_create_int32(
  env : NapiEnv,
  value : Int,
  result : Ref[NapiValue],
) -> Int = "napi_create_int32"

///|
#borrow(result)
extern "c" fn napi_get_value_double(
  env : NapiEnv,
  value : NapiValue,
  result : Ref[Double],
) -> Int = "napi_get_value_double"

///|
#borrow(result)
extern "c" fn napi_create_double(
  env : NapiEnv,
  value : Double,
  result : Ref[NapiValue],
) -> Int = "napi_create_double"

///|
#borrow(result)
extern "c" fn napi_get_value_bool(
  env : NapiEnv,
  value : NapiValue,
  result : Ref[Bool],
) -> Int = "napi_get_value_bool"

///|
#borrow(result)
extern "c" fn napi_get_boolean(
  env : NapiEnv,
  value : Bool,
  result : Ref[NapiValue],
) -> Int = "napi_get_boolean"

///|
#borrow(result)
extern "c" fn napi_get_undefined(env : NapiEnv, result : Ref[NapiValue]) -> Int = "napi_get_undefined"

///|
#borrow(buf, result)
extern "c" fn napi_get_value_string_utf8(
  env : NapiEnv,
  value : NapiValue,
  buf : Bytes,
  bufsize : Int,
  result : Ref[Int],
) -> Int = "moonbit_napi_get_value_string_utf8"

///|
#borrow(result)
extern "c" fn napi_get_value_string_utf8_length(
  env : NapiEnv,
  value : NapiValue,
  buf : UnmanagedBuffer,
  bufsize : Int,
  result : Ref[Int],
) -> Int = "moonbit_napi_get_value_string_utf8_length"

///|
#borrow(str, result)
extern "c" fn napi_create_string_utf8(
  env : NapiEnv,
  str : Bytes,
  length : Int,
  result : Ref[NapiValue],
) -> Int = "napi_create_string_utf8"

///|
#borrow(data, length)
extern "c" fn napi_get_buffer_info(
  env : NapiEnv,
  value : NapiValue,
  data : Ref[UnmanagedBuffer],
  length : Ref[Int],
) -> Int = "moonbit_napi_get_buffer_info"

///|
extern "c" fn UnmanagedBuffer::load8(
  self : UnmanagedBuffer,
  offset : Int,
) -> Int = "moonbit_ptr_load8"

///|
extern "c" fn UnmanagedBuffer::store8(
  self : UnmanagedBuffer,
  offset : Int,
  val : Int,
) = "moonbit_ptr_store8"

///|
#borrow(code, msg)
extern "c" fn napi_throw_error(env : NapiEnv, code : Bytes, msg : Bytes) -> Int = "napi_throw_error"

///|
#borrow(data, result, result_data)
extern "c" fn napi_create_buffer_copy(
  env : NapiEnv,
  length : Int,
  data : Bytes,
  result_data : Ref[UnmanagedBuffer],
  result : Ref[NapiValue],
) -> Int = "napi_create_buffer_copy"

///|
extern "c" fn moonbit_dummy_napi_value() -> NapiValue = "moonbit_dummy_napi_value"

///|
extern "c" fn moonbit_dummy_unmanaged_buffer() -> UnmanagedBuffer = "moonbit_dummy_unmanaged_buffer"

///|
extern "c" fn moonbit_dummy_deferred() -> NapiDeferred = "moonbit_dummy_deferred"

///|
#borrow(deferred, promise)
extern "c" fn napi_create_promise(
  env : NapiEnv,
  deferred : Ref[NapiDeferred],
  promise : Ref[NapiValue],
) -> Int = "napi_create_promise"

///|
extern "c" fn napi_resolve_deferred(
  env : NapiEnv,
  deferred : NapiDeferred,
  resolution : NapiValue,
) -> Int = "napi_resolve_deferred"

///|
extern "c" fn napi_reject_deferred(
  env : NapiEnv,
  deferred : NapiDeferred,
  rejection : NapiValue,
) -> Int = "napi_reject_deferred"

///|
#borrow(is_promise)
extern "c" fn napi_is_promise(
  env : NapiEnv,
  value : NapiValue,
  is_promise : Ref[Bool],
) -> Int = "moonbit_napi_is_promise"

///|
#borrow(result)
extern "c" fn napi_create_bigint_int64(
  env : NapiEnv,
  value : Int64,
  result : Ref[NapiValue],
) -> Int = "moonbit_napi_create_bigint_int64"

///|
#borrow(result)
extern "c" fn napi_create_bigint_uint64(
  env : NapiEnv,
  value : UInt64,
  result : Ref[NapiValue],
) -> Int = "moonbit_napi_create_bigint_uint64"

///|
#borrow(result, lossless)
extern "c" fn napi_get_value_bigint_int64(
  env : NapiEnv,
  value : NapiValue,
  result : Ref[Int64],
  lossless : Ref[Bool],
) -> Int = "moonbit_napi_get_value_bigint_int64"

///|
#borrow(result, lossless)
extern "c" fn napi_get_value_bigint_uint64(
  env : NapiEnv,
  value : NapiValue,
  result : Ref[UInt64],
  lossless : Ref[Bool],
) -> Int = "moonbit_napi_get_value_bigint_uint64"

///|
extern "c" fn napi_threadsafe_function_dummy() -> NapiThreadsafeFunction = "moonbit_dummy_threadsafe_function"

///|
#borrow(result)
extern "c" fn napi_create_threadsafe_function(
  env : NapiEnv,
  func : NapiValue,
  async_resource : NapiValue,
  async_resource_name : NapiValue,
  max_queue_size : Int,
  initial_thread_count : Int,
  thread_finalize_data : UnmanagedBuffer,
  thread_finalize_cb : UnmanagedBuffer,
  context : UnmanagedBuffer,
  call_js_cb : UnmanagedBuffer,
  result : Ref[NapiThreadsafeFunction],
) -> Int = "moonbit_napi_create_threadsafe_function"

///|
extern "c" fn napi_call_threadsafe_function(
  func : NapiThreadsafeFunction,
  data : UnmanagedBuffer,
  mode : Int,
) -> Int = "moonbit_napi_call_threadsafe_function"

///|
extern "c" fn napi_acquire_threadsafe_function(
  func : NapiThreadsafeFunction,
) -> Int = "moonbit_napi_acquire_threadsafe_function"

///|
extern "c" fn napi_release_threadsafe_function(
  func : NapiThreadsafeFunction,
  mode : Int,
) -> Int = "moonbit_napi_release_threadsafe_function"