import Bindings
import XCTestDynamicOverlay

public struct InitFileTransfer {
  public var run: (Int, Data, Data, ReceiveFileCallback) throws -> FileTransfer

  public func callAsFunction(
    e2eId: Int,
    e2eFileTransferParamsJSON: Data,
    fileTransferParamsJSON: Data,
    callback: ReceiveFileCallback
  ) throws -> FileTransfer {
    try run(e2eId, e2eFileTransferParamsJSON, fileTransferParamsJSON, callback)
  }
}

extension InitFileTransfer {
  public static let live = InitFileTransfer {
    e2eId, e2eFileTransferParamsJSON, fileTransferParamsJSON, callback in

    var error: NSError?
    let bindingsFileTransfer = BindingsInitFileTransfer(
      e2eId,
      callback.makeBindingsReceiveFileCallback(),
      e2eFileTransferParamsJSON,
      fileTransferParamsJSON,
      &error
    )
    if let error = error {
      throw error
    }
    guard let bindingsFileTransfer = bindingsFileTransfer else {
      fatalError("BindingsInitFileTransfer returned `nil` without providing error")
    }
    return .live(bindingsFileTransfer)
  }
}

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