import Bindings
import XCTestDynamicOverlay

public struct LookupUD {
  public var run: (Int, Contact, Data, Data, UdLookupCallback) throws -> SingleUseSendReport

  public func callAsFunction(
    e2eId: Int,
    udContact: Contact,
    lookupId: Data,
    singleRequestParamsJSON: Data = GetSingleUseParams.liveDefault(),
    callback: UdLookupCallback
  ) throws -> SingleUseSendReport {
    try run(e2eId, udContact, lookupId, singleRequestParamsJSON, callback)
  }
}

extension LookupUD {
  public static let live = LookupUD {
    e2eId, udContact, lookupId, singleRequestParamsJSON, callback in

    var error: NSError?
    let reportData = BindingsLookupUD(
      e2eId,
      udContact.data,
      callback.makeBindingsUdLookupCallback(),
      lookupId,
      singleRequestParamsJSON,
      &error
    )
    if let error = error {
      throw error
    }
    guard let reportData = reportData else {
      fatalError("BindingsLookupUD returned `nil` without providing error")
    }
    return try SingleUseSendReport.decode(reportData)
  }
}

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