// Re-export passthrough functions from internal FFI layer

///|
pub using @ffi {
  type Sound,
  type Music,
  type Wave,
  type AudioStream,
  type AudioBuffer,
  // Audio device
  init_audio_device,
  close_audio_device,
  is_audio_device_ready,
  set_master_volume,
  get_master_volume,
  // Sound
  unload_sound,
  play_sound,
  stop_sound,
  pause_sound,
  resume_sound,
  is_sound_playing,
  is_sound_valid,
  load_sound_alias,
  unload_sound_alias,
  set_sound_volume,
  set_sound_pitch,
  set_sound_pan,
  // Music
  unload_music_stream,
  play_music_stream,
  stop_music_stream,
  pause_music_stream,
  resume_music_stream,
  update_music_stream,
  is_music_stream_playing,
  is_music_valid,
  set_music_volume,
  set_music_pitch,
  set_music_pan,
  seek_music_stream,
  get_music_time_length,
  get_music_time_played,
  // Wave
  is_wave_valid,
  load_sound_from_wave,
  unload_wave,
  wave_copy,
  wave_crop,
  wave_format,
  load_wave_samples,
  // AudioStream
  load_audio_stream,
  is_audio_stream_valid,
  unload_audio_stream,
  update_audio_stream,
  is_audio_stream_processed,
  play_audio_stream,
  pause_audio_stream,
  resume_audio_stream,
  is_audio_stream_playing,
  stop_audio_stream,
  set_audio_stream_volume,
  set_audio_stream_pitch,
  set_audio_stream_pan,
  set_audio_stream_buffer_size_default,
  // AudioBuffer accessors
  audio_buffer_get_sample,
  audio_buffer_set_sample,
  // Audio processor attach/detach
  attach_audio_stream_processor,
  detach_audio_stream_processor,
  attach_audio_mixed_processor,
  detach_audio_mixed_processor,
  attach_music_stream_processor,
  detach_music_stream_processor,
}

// ============================================================================
// Sound loading (wrappers)
// ============================================================================

///|
pub fn load_sound(file_name : String) -> Sound {
  @ffi.load_sound(@utf8.encode(file_name))
}

// ============================================================================
// Music stream (wrappers)
// ============================================================================

///|
pub fn load_music_stream(file_name : String) -> Music {
  @ffi.load_music_stream(@utf8.encode(file_name))
}

// ============================================================================
// Wave loading (wrappers)
// ============================================================================

///|
pub fn load_wave(file_name : String) -> Wave {
  @ffi.load_wave(@utf8.encode(file_name))
}

///|
pub fn load_wave_from_memory(
  file_type : String,
  file_data : Bytes,
  data_size : Int,
) -> Wave {
  @ffi.load_wave_from_memory(@utf8.encode(file_type), file_data, data_size)
}

///|
pub fn export_wave(wave : Wave, file_name : String) -> Bool {
  @ffi.export_wave(wave, @utf8.encode(file_name))
}

///|
pub fn export_wave_as_code(wave : Wave, file_name : String) -> Bool {
  @ffi.export_wave_as_code(wave, @utf8.encode(file_name))
}

// ============================================================================
// Music stream from memory (wrappers)
// ============================================================================

///|
pub fn load_music_stream_from_memory(
  file_type : String,
  data : Bytes,
  data_size : Int,
) -> Music {
  @ffi.load_music_stream_from_memory(@utf8.encode(file_type), data, data_size)
}

// ============================================================================
// UpdateSound (re-export)
// ============================================================================

///|
pub using @ffi {update_sound}