// Carrega o select, o que nos permite, ver quais
        private List <Categoria> LoadCategorySelect(ProductPriceParams productPriceParams)
        {
            var categoryQuery = from m in _context.Product
                                orderby m.IdCategoriaNavigation.Nome
                                select m.IdCategoriaNavigation.Nome;

            var Categories = _context.Categoria.ToList();

            //TempData["CurrentFilter"] = productPriceParams.q;
            //TempData["Categories"] = productPriceParams.categoria;

            // Obtém as Categorias das pesquisas efetuadas anteriormente
            var selectedCategory = Categories.Where(x => x.Id == productPriceParams.Categoria).FirstOrDefault();

            if (selectedCategory != null)
            {
                ViewData["Categories"] = new SelectList(Categories, "Id", "Nome", selectedCategory.Id);
            }
            else
            {
                ViewData["Categories"] = new SelectList(Categories, "Id", "Nome");
            }

            return(Categories);
        }
        // GET: ProductPriceController
        public async Task <ActionResult> IndexAsync(ProductPriceParams productPriceParams, int?page)

        {
            // Definimos que queremos apresentar 20 produtos por página (no máximo)
            int pageSize = 20;

            //ViewData["CurrentFilterChoice"] = string.Empty;
            // Filtering
            TempData["CurrentSearch"]   = productPriceParams.Q;
            TempData["CurrentCategory"] = productPriceParams.Categoria;

            // Sorting
            ViewData["CurrentSort"]        = productPriceParams.SortBy;
            TempData["PopularitySortParm"] = productPriceParams.SortBy == null || productPriceParams.SortBy == EnumSortBy.PopularityDesc ? EnumSortBy.PopularityAsc : EnumSortBy.PopularityDesc;
            TempData["NameSortParm"]       = productPriceParams.SortBy == EnumSortBy.NameDesc ? EnumSortBy.NameAsc : EnumSortBy.NameDesc;
            TempData["DateSortParm"]       = productPriceParams.SortBy == EnumSortBy.DateAsc ? EnumSortBy.DateDesc : EnumSortBy.DateAsc;
            TempData["PriceSortParm"]      = productPriceParams.SortBy == EnumSortBy.PriceAsc ? EnumSortBy.PriceDesc : EnumSortBy.PriceAsc;
            ViewData["LowestPriceParm"]    = productPriceParams.LowestPriceEver ?? false;

            var categorias = LoadCategorySelect(productPriceParams);

            //if (productPriceParams.currentFilter != null)
            //{
            //	if (int.TryParse(productPriceParams.currentFilter, out int n) == true && categorias.Any(x => x.Id == n) && ViewData["CurrentFilterChoice"] as int? == 1)
            //	{
            //		productPriceParams.categoria = Convert.ToInt32(productPriceParams.currentFilter);
            //	}
            //	else
            //	{
            //		productPriceParams.q = productPriceParams.currentFilter;
            //	}
            //}

            // Guardar as escolhas efetuadas pelo utilizador para verificar numa próxima página.
            //TempData["CurrentFilter"] = productPriceParams.q ?? productPriceParams.categoria.ToString();

            // Obtém todos os produtos disponíveis na base de dados
            var produtos = _context.Product.Include(x => x.IdCategoriaNavigation).Include(x => x.IdPrecoNavigation).Select(x => x);

            //ViewData["PopularitySortParm"] = String.IsNullOrEmpty(productPriceParams.sortBy) ? "pop_desc" : "";
            //ViewData["NameSortParm"] = productPriceParams.sortBy == "Name" ? "name_desc" : "Name";
            //ViewData["DateSortParm"] = productPriceParams.sortBy == "Date" ? "date_desc" : "Date";

            // Se todos os argumentos são nulos, significa que o utilizador pretende ver todos os produtos.
            if (IsAllNullOrEmpty(productPriceParams))
            {
                // Ordena de acordo com a popularidade dos produtos
                produtos = produtos.OrderBy(s => s.Popularidade);

                // Retorna todos os produtos
                return(View(await PaginatedListProducts <Product> .CreateAsync(
                                produtos.AsNoTracking(), page ?? 1, pageSize)));
            }

            // Se o utilizador pretende ver os produtos com preço mínimo histórico
            if (productPriceParams.LowestPriceEver == true)
            {
                // Produtos com os preços mais baixos
                produtos = produtos.Where(x => x.IdPrecoNavigation.PrecoMaisBaixoFlag == true && x.IdPrecoNavigation.NewProduct == false);
            }
            if (productPriceParams.SelectMinRange != null)
            {
                produtos = produtos.Where(x => x.IdPrecoNavigation.PrecoAtual >= productPriceParams.SelectMinRange);
            }

            if (productPriceParams.SelectMaxRange != null)
            {
                produtos = produtos.Where(x => x.IdPrecoNavigation.PrecoAtual <= productPriceParams.SelectMinRange);
            }

            if (!String.IsNullOrEmpty(productPriceParams.Q))
            {
                produtos = produtos.Where(s => s.Nome.Contains(productPriceParams.Q) ||
                                          s.Marca.Contains(productPriceParams.Q) ||
                                          s.IdCategoriaNavigation.Nome.Contains(productPriceParams.Q));
            }
            else if (productPriceParams.Categoria > 0)
            {
                produtos = produtos.Where(s => s.IdCategoria == productPriceParams.Categoria);
            }

            //if (productPriceParams.page >= 1)
            //{
            //	string filterChoice = ViewData["CurrentFilterChoice"] as string;

            //	if (filterChoice == "Categoria")
            //	{
            //	}
            //	else if (filterChoice == "Search")
            //	{
            //	}
            //	else
            //	{
            //		throw new ArgumentOutOfRangeException();
            //	}
            //}

            produtos = productPriceParams.SortBy switch
            {
                EnumSortBy.PopularityAsc => produtos.OrderBy(s => s.Popularidade),
                EnumSortBy.PopularityDesc => produtos.OrderByDescending(s => s.Popularidade),
                EnumSortBy.NameAsc => produtos.OrderBy(s => s.Nome),
                EnumSortBy.NameDesc => produtos.OrderByDescending(s => s.Nome),
                EnumSortBy.DateAsc => produtos.OrderBy(s => s.IdPrecoNavigation.DataPrecoMaisBaixo),
                EnumSortBy.DateDesc => produtos.OrderByDescending(s => s.IdPrecoNavigation.DataPrecoMaisBaixo),
                EnumSortBy.PriceAsc => produtos.OrderBy(s => s.IdPrecoNavigation.PrecoAtual),
                EnumSortBy.PriceDesc => produtos.OrderByDescending(s => s.IdPrecoNavigation.PrecoAtual),
                EnumSortBy.PercentageAsc => throw new NotImplementedException(),
                      EnumSortBy.PercentageDesc => throw new NotImplementedException(),
                            EnumSortBy.DropAsc => throw new NotImplementedException(),
                                  EnumSortBy.DropDesc => throw new NotImplementedException(),
                                        EnumSortBy.NewestAsc => throw new NotImplementedException(),
                                              EnumSortBy.NewestDesc => throw new NotImplementedException(),
                                                    _ => produtos.OrderBy(s => s.Popularidade)
            };

            // Retorna para o utilizador
            return(View(await PaginatedListProducts <Product> .CreateAsync(
                            produtos.AsNoTracking(), page ?? 1, pageSize)));
        }