/// <summary>
        /// Place Autocomplete search request and response processor
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <BusinessResult <SearchPlacesResponse> > ExecuteAsync(SearchPlacesRequest request)
        {
            var result = new BusinessResult <SearchPlacesResponse>()
            {
                Result = new SearchPlacesResponse()
            };

            if (request == null)
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid request: request object is null", null, null));
                return(result);
            }

            if (string.IsNullOrEmpty(request.Address))
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid request:  search address  is invalid", null, request?.OperationId));
                return(result);
            }

            if (string.IsNullOrEmpty(request.ApiKey))
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Error,
                                                   "Invalid ApiKey", null, request?.OperationId));
                return(result);
            }

            if (string.IsNullOrWhiteSpace(request.OperationId))
            {
                request.OperationId = $"{Guid.NewGuid()}";
            }

            try
            {
                //  generate request
                var restServiceParameters = new RESTRequestParameters()
                {
                    Url = request.PlaceBaseUrl,
                    CancellationToken = request.CancellationToken,
                };
                var restRequest = CreateRequestDictionary(request);

                //  make service request
                var restService = await _restService.Get(restServiceParameters, restRequest.Result);

                result.Error.AddRange(restService.Error);

                //  check response status
                if (!string.IsNullOrEmpty(restService.Result?.Error_message))
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, restService.Result.Error_message, null, request.OperationId));
                }
                if (!restService.Result?.Status?.Equals($"{PlaceResponseStatus.OK}") ?? true)
                {
                    result.Error.Add(new BusinessError(LogLevel.Error, $"Reponse Status: {restService.Result.Status}", null, request.OperationId));
                }

                if (result.Error.Count == 0)
                {
                    //  process response
                    result.Result.Status       = restService.Result.Status;
                    result.Result.SessionToken = request.SessionToken;
                    result.Result.OperationId  = string.IsNullOrEmpty(result.Result.OperationId)
                                                    ? request.OperationId
                                                    : result.Result.OperationId;

                    result.Result.Predictions = new List <SearchPlacePrediction>();
                    foreach (var predicition in restService.Result.Predictions)
                    {
                        var searchPlacePredicition = new SearchPlacePrediction()
                        {
                            Description    = predicition.Description,
                            Id             = predicition.Id,
                            PlaceId        = predicition.Place_id,
                            Reference      = predicition.Reference,
                            Types          = predicition.Types.ToList(),
                            DistanceMeters = predicition.Distance_meters,
                        };
                        result.Result.Predictions.Add(searchPlacePredicition);
                    }
                }
            }
            catch (Exception ex)
            {
                result.Error.Add(new BusinessError($"{this.GetType().FullName}.ExecuteAsync", LogLevel.Critical, "Exception found", ex, request.OperationId));
            }

            return(result);
        }