import Bindings
import XCTestDynamicOverlay

public struct E2EAddPartnerCallback {
  public var run: (Data, AuthCallbacks) throws -> Cancellable

  public func callAsFunction(
    partnerId: Data,
    callbacks: AuthCallbacks
  ) throws -> Cancellable {
    try run(partnerId, callbacks)
  }
}

extension E2EAddPartnerCallback {
  public static func live(_ bindingsE2E: BindingsE2e) -> E2EAddPartnerCallback {
    E2EAddPartnerCallback { partnerId, callbacks in
      try bindingsE2E.addPartnerCallback(
        partnerId,
        cb: callbacks.makeBindingsAuthCallbacks()
      )
      return Cancellable {
        do {
          try bindingsE2E.deletePartnerCallback(partnerId)
        } catch {
          fatalError("BindingsE2e.deletePartnerCallback returned error: \(error)")
        }
      }
    }
  }
}

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