import Bindings
import XCTestDynamicOverlay

public struct GroupRequest {
  public init(handle: @escaping (Group) -> Void) {
    self.handle = handle
  }

  public var handle: (Group) -> Void
}

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

extension GroupRequest {
  func makeBindingsGroupRequest() -> BindingsGroupRequestProtocol {
    class CallbackObject: NSObject, BindingsGroupRequestProtocol {
      init(_ callback: GroupRequest) {
        self.callback = callback
      }

      let callback: GroupRequest

      func callback(_ g: BindingsGroup?) {
        guard let bindingsGroup = g else {
          fatalError("BindingsGroupRequest.handle received `nil` group")
        }
        callback.handle(.live(bindingsGroup))
      }
    }

    return CallbackObject(self)
  }
}