/// <summary>
        /// Product Lister
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="containerSize"></param>
        /// <returns></returns>
        public ActionResult ProductLister(EntityModel entity, int containerSize = 0)
        {
            SetupViewData(entity, containerSize);

            ProductListerWidget widget      = (ProductListerWidget)entity;
            IProductQueryResult queryResult = null;

            if (widget.CategoryReference != null)
            {
                var category = ResolveCategory(widget.CategoryReference);
                queryResult = ECommerceContext.Client.QueryService.Query(new Api.Model.Query {
                    Category = category
                });
            }
            else
            {
                // Use category from page controller
                //
                queryResult = (IProductQueryResult)ECommerceContext.Get(ECommerceContext.QUERY_RESULT);
            }
            if (queryResult == null)
            {
                queryResult = GetResultFromPageTemplate();
            }

            widget.Items = queryResult.Products.ToList();
            this.ProcessListerNavigationLinks(widget, queryResult, (IList <FacetParameter>)ECommerceContext.Get(ECommerceContext.FACETS));

            return(View(entity.MvcData.ViewName, entity));
        }
        /// <summary>
        /// Facets
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="containerSize"></param>
        /// <returns></returns>
        public ActionResult Facets(EntityModel entity, int containerSize = 0)
        {
            SetupViewData(entity, containerSize);
            FacetsWidget widget = (FacetsWidget)entity;

            // Get facets
            //
            IProductQueryResult queryResult = null;

            if (widget.CategoryReference != null)
            {
                var category = ResolveCategory(widget.CategoryReference);
                queryResult = ECommerceContext.Client.QueryService.Query(new Api.Model.Query {
                    Category = category
                });
            }
            else
            {
                // Use category from page controller
                //
                queryResult = (IProductQueryResult)ECommerceContext.Get(ECommerceContext.QUERY_RESULT);
            }
            if (queryResult == null)
            {
                queryResult = GetResultFromPageTemplate();
            }
            widget.FacetGroups = queryResult.FacetGroups.ToList();

            return(View(entity.MvcData.ViewName, entity));
        }
        public Query Previous(IProductQueryResult queryResult)
        {
            var query = new Query(this);

            query.StartIndex = queryResult.StartIndex - queryResult.ViewSize;
            if (query.StartIndex < 0)
            {
                return(null);
            }
            return(query);
        }
        // TODO: Add view type + filter attributes here

        public Query Next(IProductQueryResult queryResult)
        {
            var query = new Query(this);

            query.StartIndex = queryResult.StartIndex + queryResult.ViewSize;
            if (query.StartIndex > queryResult.TotalCount)
            {
                return(null);
            }
            return(query);
        }
        /// <summary>
        /// Promotions
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="containerSize"></param>
        /// <returns></returns>
        public ActionResult Promotions(EntityModel entity, int containerSize = 0)
        {
            SetupViewData(entity, containerSize);
            PromotionsWidget widget = (PromotionsWidget)entity;

            // Get promotions
            //
            IProductQueryResult queryResult = null;

            if (widget.CategoryReference != null)
            {
                var query    = new Api.Model.Query();
                var category = ResolveCategory(widget.CategoryReference);
                query.Category = category;
                if (widget.ViewType != null)
                {
                    query.ViewType = (Api.Model.ViewType)Enum.Parse(typeof(Api.Model.ViewType), widget.ViewType.ToUpper());
                }
                queryResult = ECommerceContext.Client.QueryService.Query(query);
            }
            else
            {
                // Use category from page controller
                //
                queryResult = (IProductQueryResult)ECommerceContext.Get(ECommerceContext.QUERY_RESULT);
            }
            if (queryResult == null)
            {
                queryResult = GetResultFromPageTemplate();
            }

            if (queryResult != null)
            {
                widget.Promotions = queryResult.Promotions.ToList();
            }
            else
            {
                var product = (IProduct)ECommerceContext.Get(ECommerceContext.PRODUCT);
                if (product != null)
                {
                    widget.Promotions = product.Promotions;
                }
                else
                {
                    widget.Promotions = Enumerable.Empty <IPromotion>().ToList();
                }
            }
            return(View(entity.MvcData.ViewName, entity));
        }
        /// <summary>
        /// Breadcrumb
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="containerSize"></param>
        /// <returns></returns>
        public ActionResult Breadcrumb(EntityModel entity, int containerSize = 0)
        {
            SetupViewData(entity, containerSize);
            BreadcrumbWidget widget = (BreadcrumbWidget)entity;

            // Get breadcrumb
            //
            IProductQueryResult queryResult = null;

            if (widget.CategoryReference != null)
            {
                var category = ResolveCategory(widget.CategoryReference);
                queryResult = ECommerceContext.Client.QueryService.Query(new Api.Model.Query {
                    Category = category
                });
            }
            else
            {
                // Use category from page controller
                //
                queryResult = (IProductQueryResult)ECommerceContext.Get(ECommerceContext.QUERY_RESULT);
            }
            if (queryResult == null)
            {
                queryResult = GetResultFromPageTemplate();
            }

            if (queryResult != null)
            {
                widget.Breadcrumbs = queryResult.Breadcrumbs.ToList();
                widget.TotalItems  = queryResult.TotalCount;
            }
            else
            {
                var product = (IProduct)ECommerceContext.Get(ECommerceContext.PRODUCT);
                if (product != null)
                {
                    widget.Breadcrumbs = product.Breadcrumbs;
                }
                else
                {
                    widget.Breadcrumbs = Enumerable.Empty <IBreadcrumb>().ToList();
                }
            }
            return(View(entity.MvcData.ViewName, entity));
        }
 void PrintQueryResult(IProductQueryResult result)
 {
     Console.WriteLine("  Search Results:");
     Console.WriteLine("####################");
     Console.WriteLine("Total Count: " + result.TotalCount);
     Console.WriteLine("Start index: " + result.StartIndex);
     Console.WriteLine("Current set: " + result.CurrentSet);
     Console.WriteLine("First " + result.ViewSize + " products:");
     foreach (var product in result.Products)
     {
         Console.WriteLine("Product ID: " + product.Id + ", Name: " + product.Name);
     }
     Console.WriteLine(" Facets:");
     Console.WriteLine("--------------------------");
     foreach (var facetGroup in result.FacetGroups)
     {
         Console.WriteLine("  FacetGroup: " + facetGroup.Title);
         Console.WriteLine("  Edit URL: " + facetGroup.EditUrl);
         foreach (var facet in facetGroup.Facets)
         {
             Console.WriteLine("   " + facet.Title + " (" + facet.Count + ")");
         }
     }
     Console.WriteLine(" Promotions:");
     Console.WriteLine("--------------------------");
     foreach (var promotion in result.Promotions)
     {
         Console.WriteLine("Name: " + promotion.Name);
     }
     Console.WriteLine(" Breadcrumbs:");
     Console.WriteLine("--------------------------");
     foreach (var breadcrumb in result.Breadcrumbs)
     {
         Console.WriteLine("  Breadcrumb: " + breadcrumb.Title + " (category: " + breadcrumb.IsCategory + ")");
     }
 }
        /// <summary>
        /// Process navigation links in product listers (next, previous etc).
        /// </summary>
        /// <param name="lister"></param>
        /// <param name="result"></param>
        /// <param name="facets"></param>
        protected void ProcessListerNavigationLinks(ProductListerWidget lister, IProductQueryResult result, IList <FacetParameter> facets)
        {
            int totalCount = result.TotalCount;
            int viewSize   = result.ViewSize;
            int startIndex = result.StartIndex;
            int currentSet = result.CurrentSet;

            lister.NavigationData = new ListerNavigationData();

            int viewSets = 1;

            if (totalCount > viewSize)
            {
                viewSets = (totalCount / viewSize) + 1;
            }
            lister.NavigationData.ViewSets = viewSets;

            if (viewSets > 1)
            {
                int nextStartIndex     = -1;
                int previousStartIndex = -1;
                if (currentSet > 1)
                {
                    previousStartIndex = startIndex - viewSize;
                }
                if (currentSet < viewSets)
                {
                    nextStartIndex = startIndex + viewSize;
                }
                string baseUrl = ECommerceContext.LinkResolver.GetFacetLink(facets);
                if (String.IsNullOrEmpty(baseUrl))
                {
                    baseUrl += "?";
                }
                else
                {
                    baseUrl += "&";
                }

                if (previousStartIndex != -1)
                {
                    lister.NavigationData.PreviousUrl = baseUrl + "startIndex=" + previousStartIndex;
                }
                if (nextStartIndex != -1)
                {
                    lister.NavigationData.NextUrl = baseUrl + "startIndex=" + nextStartIndex;
                }
                if (currentSet > 2)
                {
                    lister.NavigationData.FirstUrl = baseUrl + "startIndex=0";
                }
                if (currentSet + 1 < viewSets)
                {
                    lister.NavigationData.LastUrl = baseUrl + "startIndex=" + ((viewSets - 1) * viewSize);
                }
                lister.NavigationData.CurrentSet     = currentSet;
                lister.NavigationData.ShowNavigation = true;
            }
            else
            {
                lister.NavigationData.ShowNavigation = false;
            }
        }