private void UpdateResult(GetRouteByPointOriginAndDestinationQueryResponse result, BestRouteOptimoRequest model)
        {
            if (model is null)
            {
                return;
            }

            if (result.MinCost > model.TotalCost)
            {
                result.MinCost  = model.TotalCost;
                result.BestCost = model.Routes;
            }

            if (result.MinTime > model.TotalTime)
            {
                result.MinTime  = model.TotalTime;
                result.BestTime = model.Routes;
            }
        }
        private GetRouteByPointOriginAndDestinationQueryResponse GetResponse()
        {
            GetRouteByPointOriginAndDestinationQueryResponse result = new GetRouteByPointOriginAndDestinationQueryResponse();

            result.MinCost = double.MaxValue;
            result.MinTime = double.MaxValue;

            foreach (var modelStatic in _cacheBestRouteOptimoModelStatic)
            {
                foreach (var model in _cacheBestRouteOptimoModelAll)
                {
                    BestRouteOptimoRequest candidate = GetCandidate(modelStatic, model);
                    UpdateResult(result, candidate);
                }
            }

            _cacheBestRouteOptimoModelStatic.Clear();
            _cacheBestRouteOptimoModelAll.Clear();

            return(result);
        }
        public IEnumerable <Route> Execute(GetBestTimeByPointOriginAndDestinationQueryRequest request)
        {
            request.PointDestinationCode = request.PointDestinationCode.ToLower();
            request.PointOriginCode      = request.PointOriginCode.ToLower();

            if (request.PointOriginCode.Equals(request.PointDestinationCode))
            {
                throw new ResponseException(System.Net.HttpStatusCode.BadRequest, "Origin and Destination have the same code");
            }

            BestRouteRefinedAbstraction bestRoute = new BestRouteRefinedAbstraction();
            List <Route> grafo = new List <Route>();

            IEnumerable <Route> routes = _routeData.GetAllRoutes();

            grafo.AddRange(routes);

            foreach (var item in routes)
            {
                grafo.Add(new Route
                {
                    Cost          = item.Cost,
                    Time          = item.Time,
                    PointFromCode = item.PointToCode,
                    PointToCode   = item.PointFromCode
                });
            }

            GetRouteByPointOriginAndDestinationQueryResponse result =
                bestRoute.Get(grafo, request.PointOriginCode, request.PointDestinationCode);

            if (result?.BestTime is null)
            {
                throw new ResponseException(System.Net.HttpStatusCode.BadRequest, "There is no route for this points");
            }

            return(result.BestTime);
        }