/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.product.catalog.CatalogWorker;
import org.ofbiz.product.category.CategoryContentWrapper;
import org.ofbiz.product.category.CategoryWorker;
import org.ofbiz.product.product.ProductSearch;
import org.ofbiz.product.product.ProductSearchSession;

searchCategoryId = parameters.searchCategoryId;
if (!searchCategoryId) {
    searchCategoryId = context.productCategoryId;
}
if (searchCategoryId) {
    currentSearchCategory = from("ProductCategory").where("productCategoryId", searchCategoryId).queryOne();
    CategoryWorker.getRelatedCategories(request, "subCategoryList", searchCategoryId, false);
    subCategoryList = request.getAttribute("subCategoryList");
    CategoryContentWrapper categoryContentWrapper = new CategoryContentWrapper(currentSearchCategory, request);
    context.currentSearchCategory = currentSearchCategory;
    context.categoryContentWrapper = categoryContentWrapper;
}
productCategoryId = context.productCategoryId;
if (productCategoryId)  {
   context.productCategory = from("ProductCategory").where("productCategoryId", productCategoryId).queryOne();
   parameters.SEARCH_CATEGORY_ID = productCategoryId;
}

if (!parameters.clearSearch || !"N".equals(parameters.clearSearch)) {
    ProductSearchSession.searchClear(session);
}

ProductSearchSession.processSearchParameters(parameters, request);
prodCatalogId = CatalogWorker.getCurrentCatalogId(request);
result = ProductSearchSession.getProductSearchResult(request, delegator, prodCatalogId);

context.index = ProductSearchSession.getCategoryCostraintIndex(session);

searchConstraintList = ProductSearchSession.getProductSearchOptions(session).getConstraintList();

if (searchCategoryId) {
    productCategoryRollups = from("ProductCategoryRollup").where("productCategoryId", searchCategoryId).filterByDate().queryList();
    previousCategoryId = null;
    if (productCategoryRollups) {
        for (GenericValue categoryRollup : productCategoryRollups) {
            categoryConstraint = new ProductSearch.CategoryConstraint(categoryRollup.parentProductCategoryId, true, false);
            if (searchConstraintList.contains(categoryConstraint)) {
                previousCategoryId = categoryRollup.parentProductCategoryId;
                context.previousCategoryId = previousCategoryId;
            }
        }
    }
}

context.showSubCats = true;
if (subCategoryList) {
    thisSubCategoryList = [];
    subCategoryList.each { subCategory ->
        categoryCount = ProductSearchSession.getCountForProductCategory(subCategory.productCategoryId, session, delegator);
        if (categoryCount > 0) {
            subCategoryContentWrapper = new CategoryContentWrapper(subCategory, request);
            thisSubCategoryList.add([productCategoryId: subCategory.productCategoryId, categoryName: subCategory.categoryName, count: categoryCount, categoryContentWrapper: subCategoryContentWrapper]);
        }
    }
    if (thisSubCategoryList) {
        context.subCategoryList = thisSubCategoryList;
    } else {
        context.showSubCats = false;
    }
} else {
    context.showSubCats = false;
}

context.showColors = true;
colors = ProductSearchSession.listCountByFeatureForType("COLOR", session, delegator);
colorFeatureType = from("ProductFeatureType").where("productFeatureTypeId", "COLOR").queryOne();
if (colors) {
    colors.each { color ->
        featureConstraint = new ProductSearch.FeatureConstraint(color.productFeatureId, false);
        if (searchConstraintList.contains(featureConstraint)) {
            context.showColors=false;
        }
    }    
} else {
    context.showColors = false;
}
if (context.showColors) {
    context.colors = colors;
    context.colorFeatureType = colorFeatureType;
}

availablePriceRangeList = [[low: "0", high: "10"], [low: "10", high: "20"], [low: "20", high: "30"], [low: "30", high: "40"], [low: "40", high: "50"], [low: "50", high: "60"], [low: "60", high: "70"], [low: "70", high: "80"], [low: "80", high: "90"], [low: "90", high: "100"]];
priceRangeList = [];
context.showPriceRange = true;
availablePriceRangeList.each { priceRange ->
    priceRangeConstraint = new ProductSearch.ListPriceRangeConstraint(new BigDecimal(priceRange.low), new BigDecimal(priceRange.high), UtilHttp.getCurrencyUom(request));
    if (searchConstraintList.contains(priceRangeConstraint)) {
        context.showPriceRange = false;
    } else {
        priceRangeCount = ProductSearchSession.getCountForListPriceRange(new BigDecimal(priceRange.low), new BigDecimal(priceRange.high), session, delegator);
        if (priceRangeCount != 0) {
            priceRangeList.add([low: priceRange.low, high: priceRange.high, count: priceRangeCount]);
        }
    }
}
if (!priceRangeList) {
    context.showPriceRange = false;
}
if (context.showPriceRange) {
    context.priceRangeList = priceRangeList;
}

context.productIds = result.productIds;
context.viewIndex = result.viewIndex;
context.viewSize = result.viewSize;
context.listSize = result.listSize;
context.lowIndex = result.lowIndex;
context.highIndex = result.highIndex;
context.paging = result.paging;
context.previousViewSize = result.previousViewSize;
context.searchConstraintStrings = result.searchConstraintStrings;
