// Copyright 2026 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.

///|
type Prepare

///|
pub impl ToHandle for Prepare with to_handle(prepare : Prepare) -> Handle = "%identity"

///|
pub impl ToHandle for Prepare with of_handle(handle : Handle) -> Prepare = "%identity"

///|
extern "c" fn uv_prepare_make() -> Prepare = "moonbit_uv_prepare_make"

///|
#owned(uv, prepare)
extern "c" fn uv_prepare_init(uv : Loop, prepare : Prepare) -> Int = "moonbit_uv_prepare_init"

///|
pub fn Prepare::new(self : Loop) -> Prepare raise Errno {
  let prepare = uv_prepare_make()
  let status = uv_prepare_init(self, prepare)
  if status < 0 {
    raise Errno::of_int(status)
  }
  return prepare
}

///|
#owned(prepare)
extern "c" fn uv_prepare_start(
  prepare : Prepare,
  cb : (Prepare) -> Unit,
) -> Int = "moonbit_uv_prepare_start"

///|
#owned(prepare)
extern "c" fn uv_prepare_stop(prepare : Prepare) -> Int = "moonbit_uv_prepare_stop"

///|
pub fn Prepare::start(
  self : Prepare,
  cb : (Prepare) -> Unit,
) -> Unit raise Errno {
  let status = uv_prepare_start(self, fn(prepare) { cb(prepare) })
  if status < 0 {
    raise Errno::of_int(status)
  }
}

///|
pub fn Prepare::stop(self : Prepare) -> Unit raise Errno {
  let status = uv_prepare_stop(self)
  if status < 0 {
    raise Errno::of_int(status)
  }
}