/*
 * 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.UtilValidate
 import org.apache.ofbiz.entity.util.EntityUtil
 import org.apache.ofbiz.product.catalog.CatalogWorker
 
 prodCatalog = null
 prodCatalogId = parameters.prodCatalogId
 showScreen = "origin"
 List errMsgList = []
 
 productStore = EntityUtil.getFirst(delegator.findByAnd("ProductStore", [payToPartyId: partyId], null, false))
 if(productStore){
     context.productStoreId = productStore.productStoreId
 }
 if(UtilValidate.isEmpty(productStore)){
     errMsgList.add("Product Store not set!")
     showScreen = "message"
 } else {
     facility = delegator.findOne("Facility", [facilityId : productStore.inventoryFacilityId], false)
     webSite = EntityUtil.getFirst(delegator.findByAnd("WebSite", [productStoreId: productStore.productStoreId], null, false))
     
     if(UtilValidate.isEmpty(facility)){
         errMsgList.add("Facility not set!")
         showScreen = "message"
     }
     if(UtilValidate.isEmpty(webSite)){
         errMsgList.add("WebSite not set!")
         showScreen = "message"
     }
 }
 if (errMsgList) {
    request.setAttribute("_ERROR_MESSAGE_LIST_", errMsgList)
    return
 }
 
 productStoreCatalog = EntityUtil.getFirst(delegator.findByAnd("ProductStoreCatalog", [productStoreId: productStore.productStoreId], null, false))
 if(productStoreCatalog){
     prodCatalog = productStoreCatalog.getRelatedOne("ProdCatalog", false)
     prodCatalogId = prodCatalog.prodCatalogId
 }
 context.prodCatalog = prodCatalog
 context.prodCatalogId = prodCatalogId
 context.showScreen = showScreen

 if(("productcategory".equals(tabButtonItem)) || ("product".equals(tabButtonItem))){
     productCategory = null
     productCategoryId = parameters.productCategoryId
     showErrorMsg = "N"
     
     if(UtilValidate.isEmpty(prodCatalogId)){
         errMsgList.add("Product Catalog not set!")
         showErrorMsg = "Y"
     }
     
     prodCatalogCategory  = EntityUtil.getFirst(delegator.findByAnd("ProdCatalogCategory", [prodCatalogId: prodCatalogId, sequenceNum: new Long(1)], null, false))
     if(prodCatalogCategory){
         productCategory = EntityUtil.getFirst(delegator.findByAnd("ProductCategory", [primaryParentCategoryId : prodCatalogCategory.productCategoryId], null, false))
         if(productCategory){
             productCategoryId = productCategory.productCategoryId
         }
     }
     context.productCategoryId = productCategoryId
     context.productCategory = productCategory
     
     if("product".equals(tabButtonItem)){
         productId = parameters.productId
         product = null
         
         if(UtilValidate.isEmpty(productCategoryId)){
             errMsgList.add("Product Category not set!")
             showErrorMsg = "Y"
         }
         /**************** get product from ProductCategory ******************/
         productCategoryMember  = EntityUtil.getFirst(delegator.findByAnd("ProductCategoryMember", [productCategoryId: productCategoryId], null, false))
         if(productCategoryMember){
             product = productCategoryMember.getRelatedOne("Product", false)
             productId = product.productId
             // Average cost
             averageCostValues = delegator.findByAnd("ProductPrice", [productId : productId, productPricePurposeId : "PURCHASE", productPriceTypeId : "AVERAGE_COST"], null, false)
             if(averageCostValues){
                 averageCostValue = EntityUtil.getFirst(EntityUtil.filterByDate(averageCostValues))
                 if (averageCostValue?.price != null) {
                     context.averageCost = averageCostValue.price
                 }
             }
             //    Default cost
             defaultPriceValues = delegator.findByAnd("ProductPrice", [productId : productId, productPricePurposeId : "PURCHASE", productPriceTypeId : "DEFAULT_PRICE"], null, false)
             if(defaultPriceValues){
                 defaultPrice = EntityUtil.getFirst(EntityUtil.filterByDate(defaultPriceValues))
                 if (defaultPrice?.price != null) {
                     context.defaultPrice = defaultPrice.price
                 }
             }
         }
         // get promotion category
         promoCat = CatalogWorker.getCatalogPromotionsCategoryId(request, prodCatalogId)
         context.productId = productId
         context.product = product
         context.promoCat = promoCat
     }
     
     if (errMsgList) {
        request.setAttribute("_ERROR_MESSAGE_LIST_", errMsgList)
        return
     }
     context.showErrorMsg = showErrorMsg
 }
