//
// Copyright 2019 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#import <Foundation/Foundation.h>

#import "Service/Sources/EDOClientService.h"
#import "Service/Sources/EDOObject+Private.h"
#import "Service/Sources/EDOObject.h"

NS_ASSUME_NONNULL_BEGIN

@class EDOObject;
@class EDOExecutor;
@class EDOHostPort;
@class EDOServiceRequest;
@class EDOServiceResponse;

/** Propagates @c error to eDO client error handler. */
void EDOExportEDOClientError(NSError *error);

/** The internal use for sending and receiving EDOObject. */
@interface EDOClientService (Private)

/** The EDOObjects created by all services that are mapped by the remote address. */
@property(class, readonly) NSMapTable<NSNumber *, EDOObject *> *localDistantObjects;
/** The synchronization queue for accessing remote object references. */
@property(class, readonly) dispatch_queue_t edoSyncQueue;
/** The data of ping message for channel health check. */
@property(class, readonly, nonatomic) NSData *pingMessageData;

/** Get the reference of a distant object of the given @c remoteAddress. */
+ (EDOObject *)distantObjectReferenceForRemoteAddress:(EDOPointerType)remoteAddress;

/** Add reference of given distant object. It could be an EDOObject or dummy block object. */
+ (void)addDistantObjectReference:(id)object;

/** Remove the reference of a distant object of the given @c remoteAddress. */
+ (void)removeDistantObjectReference:(EDOPointerType)remoteAddress;

/** Try to get the object from local cache. Update the cache if @c object is not in it. */
+ (id)cachedEDOFromObjectUpdateIfNeeded:(id)object;

/**
 * Synchronously sends the request and waits for the response with the executor to process
 * any incoming requests.
 *
 * @note When sending a request, the executor will starts to process any incoming requests, this
 *       makes it possible to process intercepted requests, for example, the nested remote
 *       invocations.
 *
 * @param request  The request to be sent.
 * @param port     The service host port.
 * @param executor The executor to run and process the incoming requests.
 * @throw NSInternalInconsistencyException if it fails to communicate with the service.
 *
 * @return The response from the service.
 */
+ (EDOServiceResponse *)sendSynchronousRequest:(EDOServiceRequest *)request
                                        onPort:(EDOHostPort *)port
                                  withExecutor:(EDOExecutor *)executor;

/**
 * Synchronously sends the request and waits for the response.
 *
 * @param request The request to be sent.
 * @param port    The service host port.
 * @throw NSInternalInconsistencyException if it fails to communicate with the service.
 *
 * @return The response from the service.
 */
+ (EDOServiceResponse *)sendSynchronousRequest:(EDOServiceRequest *)request
                                        onPort:(EDOHostPort *)port;

/**
 * Unwraps an @c object to a local object if it comes from the local process.
 *
 * @note When nil is given, this is a no-op. This can happen when it is used to unwrap
 *       parameters of a method which may accept nil as an input argument.
 *
 * @param  object The object to be unwrapped.
 * @return The unwrapped local object if the given object is an EDOObject and it comes from the
 *         current process; otherwise, the original object is returned.
 */
+ (nullable id)unwrappedObjectFromObject:(nullable id)object;

/**
 * Synchronously sends the request and unwraps the result object from the response.
 *
 * If the object from the response can be resolved as a local object, the local object will be
 * returned; If the object is the same remote object being received before, the previous remote
 * object will be returned.
 *
 * @param request The request to be sent.
 * @param port    The service host port.
 * @throw NSInternalInconsistencyException if it fails to communicate with the service.
 *
 * @return The object being wrapped by the response.
 */
+ (nullable id)responseObjectWithRequest:(EDOServiceRequest *)request onPort:(EDOHostPort *)port;

@end

NS_ASSUME_NONNULL_END
