import Bindings

public struct ConnectionMaker {
  public var connect: (Bool, Data, Data) throws -> Connection

  public func callAsFunction(
    withAuthentication: Bool,
    recipientContact: Data,
    myIdentity: Data
  ) throws -> Connection {
    try connect(withAuthentication, recipientContact, myIdentity)
  }
}

extension ConnectionMaker {
  public static func live(bindingsClient: BindingsClient) -> ConnectionMaker {
    ConnectionMaker { withAuthentication, recipientContact, myIdentity in
      if withAuthentication {
        return Connection.live(
          bindingsConnection: try bindingsClient.connect(
            recipientContact,
            myIdentity: myIdentity
          )
        )
      } else {
        return Connection.live(
          bindingsAuthenticatedConnection: try bindingsClient.connect(
            withAuthentication: recipientContact,
            myIdentity: myIdentity
          )
        )
      }
    }
  }
}

#if DEBUG
extension ConnectionMaker {
  public static let failing = ConnectionMaker { _, _, _ in
    struct NotImplemented: Error {}
    throw NotImplemented()
  }
}
#endif