/*
 * 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.UtilMisc
import org.apache.ofbiz.entity.util.EntityTypeUtil
import org.apache.ofbiz.entity.util.EntityUtil

orderId = parameters.orderId
if (!orderId) return

shipGroupSeqId = parameters.shipGroupSeqId

// if a particular ship group is requested, we will limit ourselves to it
findMap = [orderId: orderId]
if (shipGroupSeqId) findMap.shipGroupSeqId = shipGroupSeqId

shipGroups = from("OrderItemShipGroup").where(findMap).orderBy("shipGroupSeqId").queryList()
context.shipGroups = shipGroups

// method to expand the marketing packages
LinkedList expandProductGroup(product, quantityInGroup, quantityShipped, quantityOpen, assocType) {
    sublines = []
    associations = product.getRelated("MainProductAssoc", [productAssocTypeId : assocType], null, false)
    associations = EntityUtil.filterByDate(associations)
    associations.each { association ->
        line = [:]
        line.product = association.getRelatedOne("AssocProduct", false)

        // determine the quantities
        quantityComposed = association.quantity ?: 0
        line.quantityInGroup = quantityInGroup * quantityComposed
        line.quantityShipped = quantityShipped * quantityComposed
        line.quantityOpen = quantityOpen * quantityComposed

        sublines.add(line)
    }
    return sublines
}

groupData = [:]
shipGroups.each { shipGroup ->
    data = [:]

    address = shipGroup.getRelatedOne("PostalAddress", false)
    data.address = address

    phoneNumber = shipGroup.getRelatedOne("TelecomTelecomNumber", false)
    data.phoneNumber = phoneNumber

    carrierShipmentMethod = shipGroup.getRelatedOne("CarrierShipmentMethod", false)
    if (carrierShipmentMethod) {
        data.carrierShipmentMethod = carrierShipmentMethod
        data.shipmentMethodType = carrierShipmentMethod.getRelatedOne("ShipmentMethodType", true)
    }

    // the lines in a page, each line being a row of data to display
    lines = []

    // process the order item to ship group associations, each being a line item for the group
    orderItemAssocs = shipGroup.getRelated("OrderItemShipGroupAssoc", null, ["orderItemSeqId"], false)
    orderItemAssocs.each { orderItemAssoc ->
        orderItem = orderItemAssoc.getRelatedOne("OrderItem", false)
        product = orderItem.getRelatedOne("Product", false)
        line = [:]

        // the quantity in group
        quantityInGroup = orderItemAssoc.quantity
        if (orderItemAssoc.cancelQuantity) {
            quantityInGroup -= orderItemAssoc.cancelQuantity
        }

        // the quantity shipped
        quantityShipped = 0.0
        issuances = from("ItemIssuance").where("orderId", orderItem.orderId, "orderItemSeqId", orderItem.orderItemSeqId, "shipGroupSeqId", orderItemAssoc.shipGroupSeqId).queryList()
        issuances.each { issuance ->
            quantityShipped += issuance.quantity
        }

        // the quantity open (ordered - shipped)
        quantityOpen = orderItem.quantity
        if (orderItem.cancelQuantity) {
            quantityOpen -= orderItem.cancelQuantity
        }
        quantityOpen -= quantityShipped

        line.orderItem = orderItem
        line.product = product
        line.quantityInGroup = quantityInGroup
        line.quantityShipped = quantityShipped
        line.quantityOpen = quantityOpen

        if (EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.productTypeId, "parentTypeId", "MARKETING_PKG")) {
            assocType = EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.productTypeId, "parentTypeId", "MARKETING_PKG_AUTO") ? "MANUF_COMPONENT" : "PRODUCT_COMPONENT"
            sublines = expandProductGroup(product, quantityInGroup, quantityShipped, quantityOpen, assocType)
            line.expandedList = sublines
        }

        lines.add(line)
    }
    data.lines = lines
    groupData[shipGroup.shipGroupSeqId] = data
}
context.groupData = groupData
