public virtual async Task <ProductSearchResult> SearchProductAsync(SearchCriteria criteria)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException(nameof(criteria));
            }
            if (criteria.CultureInfo == null)
            {
                throw new ArgumentException(GetMessageOfNull(nameof(criteria.CultureInfo)), nameof(criteria));
            }
            if (string.IsNullOrWhiteSpace(criteria.Scope))
            {
                throw new ArgumentException(GetMessageOfNullWhiteSpace(nameof(criteria.Scope)), nameof(criteria));
            }

            var request = CreateSearchRequest(criteria);

            var results = await ExecuteProductSearchRequestAsync(request).ConfigureAwait(false);

            if (results?.Facets == null)
            {
                return(results);
            }

            var facetsToQuery = GetFacetFieldNameToQuery(criteria);

            results.Facets.RemoveAll(facet => !facetsToQuery.Contains(facet.FieldName));

            if (criteria.SelectedFacets.Count == 0)
            {
                return(results);
            }

            var param = new RemoveSelectedFacetsFromFacetsParam
            {
                Facets         = results.Facets,
                SelectedFacets = criteria.SelectedFacets,
                FacetSettings  = FacetConfigContext.GetFacetSettings()
            };

            results.Facets = RemoveSelectedFacetsFromFacets(param);

            return(results);
        }
        protected virtual List <Facet> RemoveSelectedFacetsFromFacets(RemoveSelectedFacetsFromFacetsParam param)
        {
            var strippedFacets = new List <Facet>();
            var facets         = param.Facets;
            var selectedFacets = param.SelectedFacets;
            var facetSettings  = param.FacetSettings;

            foreach (var facet in facets)
            {
                var facetSetting = facetSettings.FirstOrDefault(setting => setting.FieldName == facet.FieldName);

                if (facetSetting?.FacetType == Facets.FacetType.MultiSelect || selectedFacets.Find(selectedFacet => selectedFacet.Name == facet.FieldName) == null)
                {
                    strippedFacets.Add(facet);
                }
            }

            return(strippedFacets);
        }