// Copyright 2025 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
pub fn create_instance() -> Instance {
  wgpuCreateInstance(null_instance_descriptor_ptr())
}

///|
pub extern "C" fn create_instance_with_extras_u32(
  backends_u64 : UInt64,
  flags_u32 : UInt,
  dx12_shader_compiler_u32 : UInt,
  gles3_minor_version_u32 : UInt,
  gl_fence_behaviour_u32 : UInt,
  dxc_max_shader_model_u32 : UInt,
  dx12_presentation_system_u32 : UInt,
) -> Instance = "mbt_wgpu_create_instance_with_extras_u32"

///|
#borrow(dxc_path_utf8)
pub extern "C" fn create_instance_with_extras_utf8(
  backends_u64 : UInt64,
  flags_u32 : UInt,
  dx12_shader_compiler_u32 : UInt,
  dxc_path_utf8 : Bytes,
  dxc_path_utf8_len : UInt64,
  gles3_minor_version_u32 : UInt,
  gl_fence_behaviour_u32 : UInt,
  dxc_max_shader_model_u32 : UInt,
  dx12_presentation_system_u32 : UInt,
) -> Instance = "mbt_wgpu_create_instance_with_extras_utf8"

///|
pub extern "C" fn instance_capabilities_timed_wait_any_enable_u32() -> UInt = "mbt_wgpu_instance_capabilities_timed_wait_any_enable_u32"

///|
pub extern "C" fn instance_capabilities_timed_wait_any_max_count_u64() -> UInt64 = "mbt_wgpu_instance_capabilities_timed_wait_any_max_count_u64"

///|
pub extern "C" fn instance_wait_any_one_packed_u64(
  instance : Instance,
  future_id : UInt64,
  timeout_ns : UInt64,
) -> UInt64 = "mbt_wgpu_instance_wait_any_one_packed_u64"

///|
pub extern "C" fn queue_on_submitted_work_done_future_id_u64(
  queue : Queue,
) -> UInt64 = "mbt_wgpu_queue_on_submitted_work_done_future_id_u64"

///|
pub extern "C" fn queue_on_submitted_work_done_async_status_u32(
  future_id : UInt64,
) -> UInt = "mbt_wgpu_queue_on_submitted_work_done_async_status_u32"

///|
pub extern "C" fn queue_on_submitted_work_done_async_clear(
  future_id : UInt64,
) -> Unit = "mbt_wgpu_queue_on_submitted_work_done_async_clear"

///|
pub extern "C" fn queue_submit_one_and_map_read_async(
  queue : Queue,
  command_buffer : CommandBuffer,
  buffer : Buffer,
  offset : UInt64,
  size : UInt64,
) -> UInt64 = "mbt_wgpu_queue_submit_one_and_map_read_async"

///|
pub extern "C" fn queue_map_read_async_status_u32(future_id : UInt64) -> UInt = "mbt_wgpu_queue_map_read_async_status_u32"

///|
pub extern "C" fn queue_map_read_async_size_u64(future_id : UInt64) -> UInt64 = "mbt_wgpu_queue_map_read_async_size_u64"

///|
#borrow(out)
pub extern "C" fn queue_map_read_async_read(
  future_id : UInt64,
  out : Bytes,
  out_len : UInt64,
) -> Bool = "mbt_wgpu_queue_map_read_async_read"

///|
pub extern "C" fn queue_map_read_async_clear(future_id : UInt64) -> Unit = "mbt_wgpu_queue_map_read_async_clear"

///|
pub extern "C" fn instance_request_adapter_future_id_u64(
  instance : Instance,
  options : WGPURequestAdapterOptionsPtr,
) -> UInt64 = "mbt_wgpu_instance_request_adapter_future_id_u64"

///|
pub extern "C" fn instance_request_adapter_async_status_u32(
  future_id : UInt64,
) -> UInt = "mbt_wgpu_instance_request_adapter_async_status_u32"

///|
pub extern "C" fn instance_request_adapter_async_adapter(
  future_id : UInt64,
) -> WGPUAdapter = "mbt_wgpu_instance_request_adapter_async_adapter"

///|
pub extern "C" fn instance_request_adapter_async_message_utf8_len(
  future_id : UInt64,
) -> UInt64 = "mbt_wgpu_instance_request_adapter_async_message_utf8_len"

///|
#borrow(out)
pub extern "C" fn instance_request_adapter_async_message_utf8(
  future_id : UInt64,
  out : Bytes,
  out_len : UInt64,
) -> Bool = "mbt_wgpu_instance_request_adapter_async_message_utf8"

///|
pub extern "C" fn instance_request_adapter_async_clear(
  future_id : UInt64,
) -> Unit = "mbt_wgpu_instance_request_adapter_async_clear"

///|
pub extern "C" fn instance_enumerate_adapters_count_metal(
  instance : Instance,
) -> UInt64 = "mbt_wgpu_instance_enumerate_adapters_count_metal"

///|
pub extern "C" fn instance_enumerate_adapters_count_vulkan(
  instance : Instance,
) -> UInt64 = "mbt_wgpu_instance_enumerate_adapters_count_vulkan"

///|
pub extern "C" fn instance_enumerate_adapter_first_vulkan(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_vulkan"

///|
pub extern "C" fn instance_enumerate_adapter_first_dx12(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_dx12"

///|
pub extern "C" fn instance_enumerate_adapter_first_dx11(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_dx11"

///|
pub extern "C" fn instance_enumerate_adapter_first_metal(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_metal"

///|
pub extern "C" fn instance_enumerate_adapter_first_gl(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_gl"

///|
pub extern "C" fn instance_enumerate_adapter_first_primary(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_enumerate_adapter_first_primary"

///|
pub extern "C" fn instance_request_adapter_sync(
  instance : Instance,
) -> WGPUAdapter = "mbt_wgpu_instance_request_adapter_sync"

///|
pub extern "C" fn instance_request_adapter_sync_ptr(
  instance : Instance,
  options : WGPURequestAdapterOptionsPtr,
) -> WGPUAdapter = "mbt_wgpu_instance_request_adapter_sync_ptr"

///|
pub extern "C" fn instance_request_adapter_sync_last_status_u32() -> UInt = "mbt_wgpu_instance_request_adapter_sync_last_status_u32"

///|
pub extern "C" fn instance_request_adapter_sync_last_message_utf8_len() -> UInt64 = "mbt_wgpu_instance_request_adapter_sync_last_message_utf8_len"

///|
#borrow(out)
pub extern "C" fn instance_request_adapter_sync_last_message_utf8(
  out : Bytes,
  out_len : UInt64,
) -> Bool = "mbt_wgpu_instance_request_adapter_sync_last_message_utf8"

///|
pub fn instance_request_adapter_sync_options_u32(
  instance : Instance,
  feature_level_u32 : UInt,
  power_preference_u32 : UInt,
  force_fallback_adapter : Bool,
  backend_type_u32 : UInt,
  compatible_surface : WGPUSurface,
) -> Adapter {
  let opts = request_adapter_options_new_u32(
    feature_level_u32, power_preference_u32, force_fallback_adapter, backend_type_u32,
    compatible_surface,
  )
  let adapter = instance_request_adapter_sync_ptr(instance, opts)
  request_adapter_options_free(opts)
  adapter
}

///|
pub extern "C" fn instance_process_events(instance : Instance) -> Unit = "wgpuInstanceProcessEvents"

///|