/*
 * 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.apache.ofbiz.base.util.UtilHttp
import org.apache.ofbiz.entity.util.EntityUtil
import org.apache.ofbiz.product.catalog.CatalogWorker
import org.apache.ofbiz.product.category.CategoryContentWrapper
import org.apache.ofbiz.product.category.CategoryWorker
import org.apache.ofbiz.product.product.ProductSearch
import org.apache.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 (categoryRollup in 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
