/*
 * 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.service.*
import org.apache.ofbiz.entity.*
import org.apache.ofbiz.base.util.*
import org.apache.ofbiz.order.order.OrderReadHelper
import org.apache.ofbiz.order.shoppingcart.*
import org.apache.ofbiz.party.party.PartyWorker
import org.apache.ofbiz.product.catalog.CatalogWorker

productId = parameters.productId
if (productId) {

    quantityOnHandTotal = parameters.quantityOnHandTotal
    if (!quantityOnHandTotal) {
        quantityOnHandTotal = 0
    }
    context.quantityOnHandTotal = quantityOnHandTotal

    availableToPromiseTotal = parameters.availableToPromiseTotal
    if (!availableToPromiseTotal) {
        availableToPromiseTotal = 0
    }
    context.availableToPromiseTotal = availableToPromiseTotal
}
context.productId = productId

// Just in case we are here from the choosecatalog form, the
// following call will save in the session the new catalogId
CatalogWorker.getCurrentCatalogId(request)

// Get the Cart and Prepare Size
shoppingCart = ShoppingCartEvents.getCartObject(request)
context.shoppingCartSize = shoppingCart.size()
context.shoppingCart = shoppingCart
context.currencyUomId = shoppingCart.getCurrency()
context.orderType = shoppingCart.getOrderType()

orderItems = shoppingCart.makeOrderItems()
orderAdjustments = shoppingCart.makeAllAdjustments()
orderItemShipGroupInfo = shoppingCart.makeAllShipGroupInfos()
if (orderItemShipGroupInfo) {
    orderItemShipGroupInfo.each { osiInfo ->
        if ("OrderAdjustment".equals(osiInfo.getEntityName())) {
            // shipping / tax adjustment(s)
            orderAdjustments.add(osiInfo)
        }
    }
}
orderHeaderAdjustments = OrderReadHelper.getOrderHeaderAdjustments(orderAdjustments, null)
orderSubTotal = OrderReadHelper.getOrderItemsSubTotal(orderItems, orderAdjustments)
shippingAmount = OrderReadHelper.getAllOrderItemsAdjustmentsTotal(orderItems, orderAdjustments, false, false, true)
shippingAmount = shippingAmount.add(OrderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, false, false, true))
context.orderShippingTotal = shippingAmount
taxAmount = OrderReadHelper.getOrderTaxByTaxAuthGeoAndParty(orderAdjustments).taxGrandTotal
context.orderTaxTotal = taxAmount

// get all the possible gift wrap options
allgiftWraps = from("ProductFeature").where("productFeatureTypeId", "GIFT_WRAP").orderBy("defaultSequenceNum").queryList()
context.allgiftWraps = allgiftWraps

context.contentPathPrefix = CatalogWorker.getContentPathPrefix(request)

// retrieve the product store id from the cart
productStoreId = shoppingCart.getProductStoreId()
context.productStoreId = productStoreId

partyId = shoppingCart.getPartyId()
if ("_NA_".equals(partyId)) partyId = null
context.partyId = partyId

defaultDesiredDeliveryDate = shoppingCart.getDefaultItemDeliveryDate()
if (!defaultDesiredDeliveryDate) {
    defaultDesiredDeliveryDate = (new java.sql.Date(System.currentTimeMillis())).toString()
} else {
    context.useAsDefaultDesiredDeliveryDate =  "true"
}
context.defaultDesiredDeliveryDate = defaultDesiredDeliveryDate

defaultComment = shoppingCart.getDefaultItemComment()
if (defaultComment) {
    context.useAsDefaultComment = "true"
}
context.defaultComment = defaultComment

// get all party shopping lists
if (partyId) {
  shoppingLists = from("ShoppingList").where("partyId", partyId).queryList()
  context.shoppingLists = shoppingLists
}

// get product inventory summary for each shopping cart item
productStore = from("ProductStore").where("productStoreId", productStoreId).cache(true).queryOne()
context.productStore = productStore
productStoreFacilityId = null
if (productStore) {
    productStoreFacilityId = productStore.inventoryFacilityId
}
context.facilityId = productStoreFacilityId
inventorySummary = runService('getProductInventorySummaryForItems', [orderItems : shoppingCart.makeOrderItems(), facilityId : productStoreFacilityId])
context.availableToPromiseMap = inventorySummary.availableToPromiseMap
context.quantityOnHandMap = inventorySummary.quantityOnHandMap
context.mktgPkgATPMap = inventorySummary.mktgPkgATPMap
context.mktgPkgQOHMap = inventorySummary.mktgPkgQOHMap

// get purchase order item types
purchaseOrderItemTypeList = from("OrderItemType").where("parentTypeId", "PURCHASE_SPECIFIC").cache(true).queryList()
context.purchaseOrderItemTypeList = purchaseOrderItemTypeList
