public ActionResult Index(string id)
        {
            var products = _unitOfWork.ProductRepository.Get().ToList();
            var product = _unitOfWork.ProductRepository.GetById(new Guid(id));

            if (product == null)
            {
                return View("Error");
            }

            var image800x640Paths = product.Image800x640Paths.ToList();
            var imageAdditional = GetImageAdditionalModels(image800x640Paths);

            var relatedProductIds = _unitOfWork.RelatedProductRepository.Get(i=>i.ProductId==new Guid(id)).Select(r=>r.RelatedProductId);

            var relatedProducts = _unitOfWork.ProductRepository.Get(p => relatedProductIds.Contains(p.Id)).ToList();
            var relatedProductBlocks = GetRelatedProductBlocks(relatedProducts);

            var categoryViewModels = GetCategories(product, products);

            var specialProduct = products.First(i => i.Id == new Guid("CD4879A0-C210-4DAA-A6DE-A59E9CC153BF"));
            var specialProductViewModel = new SpecialProductViewModel
            {
                Id = specialProduct.Id.ToString(),
                Name = specialProduct.Name,
                OldPrice = specialProduct.OldPrice.HasValue ? specialProduct.OldPrice.Value.ToString("C") : string.Empty,
                NewPrice = specialProduct.NewPrice.ToString("C"),
                RatingImagePath = specialProduct.RatingImagePath,
                Image240x192Path = specialProduct.Image240x192Path
            };

            var productInfo = new ProductInfo
            {
                Id = product.Id.ToString(),
                Name = product.Name,
                DefaultImage = image800x640Paths.First(i => i.IsActive).Path,
                OldPrice = product.OldPrice.HasValue ? product.OldPrice.Value.ToString("C") : string.Empty,
                NewPrice = product.NewPrice.ToString("C"),
                ExTax = (product.NewPrice - product.NewPrice*.15m).ToString("C"),
                Brand = product.Brand.Name,
                BrandId = product.Brand.Id.ToString(),
                Description = product.Description,
                ImageAdditionals = imageAdditional,
                Availability = "In Stock"
            };

            var productModel = new ProductModel
            {
                ProductInfo=productInfo,
                RelatedProductBlocks = relatedProductBlocks,
                RelatedProductCount=relatedProducts.Count,
                CategoryViewModels=categoryViewModels,
                SpecialProductViewModel=specialProductViewModel
            };
            return View(productModel);
        }
        public ActionResult Category(string id,string sort="default",string order="asc",int pageIndex=0,int pageSize=2)
        {
            var products = _unitOfWork.ProductRepository.Get().ToList();//new ProductsBuilder().Build());

            @ViewBag.Sort = sort;
            @ViewBag.Order = order;
            @ViewBag.PageSize = pageSize;
            
            var category = _categories.First(i => i.Id==new Guid(id));
            var allCategories = category.GetAllCategories();
            var selectedProducts = products.Where(p => allCategories.Contains(p.CategoryId)).ToList();
            var paginatedProducts = new PaginatedList<Product>(selectedProducts, pageIndex, pageSize);
            
            var categoryViewModels = GetCategoriesByCategory(category, products);

            var specialProduct = products.First(i => i.Id == new Guid("CD4879A0-C210-4DAA-A6DE-A59E9CC153BF"));
            var specialProductViewModel = new SpecialProductViewModel
            {
                Id = specialProduct.Id.ToString(),
                Name = specialProduct.Name,
                OldPrice = specialProduct.OldPrice.HasValue? specialProduct.OldPrice.Value.ToString("C"):string.Empty,
                NewPrice = specialProduct.NewPrice.ToString("C"),
                RatingImagePath = specialProduct.RatingImagePath,
                Image240x192Path = specialProduct.Image240x192Path
            };

            var refineSearchs = new List<RefineSearch>();
            foreach (var childCategory in _categories.Where(c=>c.ParentCategory==category))
            {
                var refineSearch = new RefineSearch
                {
                    Id = childCategory.Id.ToString(),
                    Name = childCategory.Name,
                    Total = products.Count(p => p.CategoryId == childCategory.Id)
                };
                refineSearchs.Add(refineSearch);
            }

            var productsBlock = GetProductsBlocks(paginatedProducts.ToList());

            var categoryModel = new CategoryModel
            {
                Id=id,
                Name=category.Name,
                Description = category.Description,
                ImagePath=category.ImagePath,
                RefineSearches=refineSearchs,
                CategoryViewModels=categoryViewModels,
                SpecialProductViewModel=specialProductViewModel,
                ProductsBlock=productsBlock,
                PaginatedList=paginatedProducts
            };

            return View(categoryModel);
        }