///
/// ToolDefinition.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 2026 Marc Rousavy @ Margelo
///

import Foundation
import NitroModules

/**
 * Represents an instance of `ToolDefinition`, backed by a C++ struct.
 */
public typealias ToolDefinition = margelo.nitro.mlxreactnative.ToolDefinition

public extension ToolDefinition {
  private typealias bridge = margelo.nitro.mlxreactnative.bridge.swift

  /**
   * Create a new instance of `ToolDefinition`.
   */
  init(name: String, description: String, parameters: [ToolParameter], handler: @escaping (_ args: AnyMap) -> Promise<Promise<AnyMap>>) {
    self.init(std.string(name), std.string(description), { () -> bridge.std__vector_ToolParameter_ in
      var __vector = bridge.create_std__vector_ToolParameter_(parameters.count)
      for __item in parameters {
        __vector.push_back(__item)
      }
      return __vector
    }(), { () -> bridge.Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_ in
      let __closureWrapper = Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(handler)
      return bridge.create_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(__closureWrapper.toUnsafe())
    }())
  }

  var name: String {
    @inline(__always)
    get {
      return String(self.__name)
    }
    @inline(__always)
    set {
      self.__name = std.string(newValue)
    }
  }
  
  var description: String {
    @inline(__always)
    get {
      return String(self.__description)
    }
    @inline(__always)
    set {
      self.__description = std.string(newValue)
    }
  }
  
  var parameters: [ToolParameter] {
    @inline(__always)
    get {
      return self.__parameters.map({ __item in __item })
    }
    @inline(__always)
    set {
      self.__parameters = { () -> bridge.std__vector_ToolParameter_ in
        var __vector = bridge.create_std__vector_ToolParameter_(newValue.count)
        for __item in newValue {
          __vector.push_back(__item)
        }
        return __vector
      }()
    }
  }
  
  var handler: (_ args: AnyMap) -> Promise<Promise<AnyMap>> {
    @inline(__always)
    get {
      return { () -> (AnyMap) -> Promise<Promise<AnyMap>> in
        let __wrappedFunction = bridge.wrap_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(self.__handler)
        return { (__args: AnyMap) -> Promise<Promise<AnyMap>> in
          let __result = __wrappedFunction.call(__args.cppPart)
          return { () -> Promise<Promise<AnyMap>> in
            let __promise = Promise<Promise<AnyMap>>()
            let __resolver = { (__result: Promise<AnyMap>) in
              __promise.resolve(withResult: __result)
            }
            let __rejecter = { (__error: Error) in
              __promise.reject(withError: __error)
            }
            let __resolverCpp = { () -> bridge.Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___ in
              let __closureWrapper = Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___(__resolver)
              return bridge.create_Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___(__closureWrapper.toUnsafe())
            }()
            let __rejecterCpp = { () -> bridge.Func_void_std__exception_ptr in
              let __closureWrapper = Func_void_std__exception_ptr(__rejecter)
              return bridge.create_Func_void_std__exception_ptr(__closureWrapper.toUnsafe())
            }()
            let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap_____(__result)
            __promiseHolder.addOnResolvedListener(__resolverCpp)
            __promiseHolder.addOnRejectedListener(__rejecterCpp)
            return __promise
          }()
        }
      }()
    }
    @inline(__always)
    set {
      self.__handler = { () -> bridge.Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_ in
        let __closureWrapper = Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(newValue)
        return bridge.create_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(__closureWrapper.toUnsafe())
      }()
    }
  }
}
