import Bindings
import XCTestDynamicOverlay

public struct RequestRestlike {
  public var run: (Int, Contact, RestlikeMessage, Data) throws -> RestlikeMessage

  public func callAsFunction(
    e2eId: Int,
    recipient: Contact,
    request: RestlikeMessage,
    paramsJSON: Data
  ) throws -> RestlikeMessage {
    try run(e2eId, recipient, request, paramsJSON)
  }
}

extension RequestRestlike {
  public static let live = RequestRestlike { e2dId, recipient, request, paramsJSON in
    var error: NSError?
    let responseData = BindingsRequestRestLike(
      e2dId,
      recipient.data,
      try request.encode(),
      paramsJSON,
      &error
    )
    if let error = error {
      throw error
    }
    guard let responseData = responseData else {
      fatalError("BindingsRequestRestLike returned `nil` without providing error")
    }
    return try RestlikeMessage.decode(responseData)
  }
}

extension RequestRestlike {
  public static let unimplemented = RequestRestlike(
    run: XCTUnimplemented("\(Self.self)")
  )
}