public async Task <Models.ActionResult <SearchResult> > Search(TrackingSearcher searcher)
        {
            Models.ActionResult <SearchResult> result = null;
            try
            {
                if (searcher != null && ModelState.IsValid)
                {
                    var searchResult = await TrackingManager.Search(searcher);

                    result = new Models.ActionResult <SearchResult>(HttpStatusCode.OK, searchResult);
                }
                else
                {
                    result = searcher == null ? new Models.ActionResult <SearchResult>(HttpStatusCode.BadRequest, "Search parameters are required") : new Models.ActionResult <SearchResult>(HttpStatusCode.BadRequest, ModelState);
                }
            }
            catch (ArgumentException ex)
            {
                result = new Models.ActionResult <SearchResult>(HttpStatusCode.BadRequest, ex.Message); // In the case of argument exception we will be getting meaning full error message.
            }
            catch (Exception)
            {
                result = new Models.ActionResult <SearchResult>(HttpStatusCode.InternalServerError, $"Internal server error has accured while searching tracking records for the vehicle:{searcher?.VehicleID}"); // no need to share implementation details with the consumer.
            }

            return(result);
        }
        public async Task <SearchResult> Search(TrackingSearcher searcher)
        {
            try
            {
                var result = await _trackingRepository.Search(searcher);

                for (int i = 0; i < result.Path.Length; i++)
                {
                    result.Path[i].Address = await ReverseGeocode(result.Path[i].Lat, result.Path[i].Long);
                }
                return(result);
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, $"Error accured while searching tracking data for VehicleID:{searcher.VehicleID} from {(new DateTime(searcher.StartTime)).ToLongDateString()} to {(new DateTime(searcher.EndTime)).ToLongDateString()}");
                throw;
            }
        }