/*
 * 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.entity.*
import org.apache.ofbiz.entity.util.*
import org.apache.ofbiz.entity.condition.EntityCondition

shipmentId = request.getParameter("shipmentId")
orderId = request.getParameter("orderId")
shipGroupSeqId = request.getParameter("shipGroupSeqId")
selectFromShipmentPlan = request.getParameter("selectFromShipmentPlan")

shipment = from("Shipment").where("shipmentId", shipmentId).queryOne()

if (shipment) {
    context.originFacility = shipment.getRelatedOne("OriginFacility", false)
    context.destinationFacility = shipment.getRelatedOne("DestinationFacility", false)
}

if (!orderId && shipment && !selectFromShipmentPlan) {
    orderId = shipment.primaryOrderId
}
if (!shipGroupSeqId && shipment) {
    shipGroupSeqId = shipment.primaryShipGroupSeqId
}

if (orderId && shipment) {
    orderHeader = from("OrderHeader").where("orderId", orderId).queryOne()
    context.orderHeader = orderHeader

    if (orderHeader) {
        context.orderHeaderStatus = orderHeader.getRelatedOne("StatusItem", false)
        context.orderType = orderHeader.getRelatedOne("OrderType", false)

        isSalesOrder = "SALES_ORDER".equals(orderHeader.orderTypeId)
        context.isSalesOrder = isSalesOrder

        orderItemShipGroup = null
        if (shipGroupSeqId) {
            orderItemShipGroup = from("OrderItemShipGroup").where("orderId", orderId, "shipGroupSeqId", shipGroupSeqId).queryOne()
            context.orderItemShipGroup = orderItemShipGroup
        }

        oiasgaLimitMap = null
        if (orderItemShipGroup) {
            oiasgaLimitMap = [shipGroupSeqId : shipGroupSeqId]
        }
        orderItems = orderHeader.getRelated("OrderItemAndShipGroupAssoc", oiasgaLimitMap, ['shipGroupSeqId', 'orderItemSeqId'], false)
        orderItemDatas = [] as LinkedList
        orderItems.each { orderItemAndShipGroupAssoc ->
            orderItemData = [:]
            product = orderItemAndShipGroupAssoc.getRelatedOne("Product", false)

            itemIssuances = orderItemAndShipGroupAssoc.getRelated("ItemIssuance", null, null, false)
            totalQuantityIssued = 0
            itemIssuances.each { itemIssuance ->
                if (itemIssuance.quantity) {
                    totalQuantityIssued += itemIssuance.getDouble("quantity")
                }
                if (itemIssuance.cancelQuantity) {
                    totalQuantityIssued -= itemIssuance.getDouble("cancelQuantity")
                }
            }

            if (isSalesOrder) {
                oisgirLimitMap = null
                if (orderItemShipGroup) {
                    oisgirLimitMap = [shipGroupSeqId : shipGroupSeqId]
                }
                orderItemShipGrpInvResList = orderItemAndShipGroupAssoc.getRelated("OrderItemShipGrpInvRes", oisgirLimitMap, ['reservedDatetime'], false)
                orderItemShipGrpInvResDatas = [] as LinkedList
                totalQuantityReserved = 0
                orderItemShipGrpInvResList.each { orderItemShipGrpInvRes ->
                    inventoryItem = orderItemShipGrpInvRes.getRelatedOne("InventoryItem", false)
                    orderItemShipGrpInvResData = [:]
                    orderItemShipGrpInvResData.orderItemShipGrpInvRes = orderItemShipGrpInvRes
                    orderItemShipGrpInvResData.inventoryItem = inventoryItem
                    orderItemShipGrpInvResData.inventoryItemFacility = inventoryItem.getRelatedOne("Facility", false)
                    orderItemShipGrpInvResDatas.add(orderItemShipGrpInvResData)

                    if (orderItemShipGrpInvRes.quantity) {
                        totalQuantityReserved += orderItemShipGrpInvRes.getDouble("quantity")
                    }
                }

                orderItemData.orderItemShipGrpInvResDatas = orderItemShipGrpInvResDatas
                orderItemData.totalQuantityReserved = totalQuantityReserved
                orderItemData.totalQuantityIssuedAndReserved = totalQuantityReserved + totalQuantityIssued
            }

            orderItemData.orderItemAndShipGroupAssoc = orderItemAndShipGroupAssoc
            orderItemData.product = product
            orderItemData.itemIssuances = itemIssuances
            orderItemData.totalQuantityIssued = totalQuantityIssued
            orderItemDatas.add(orderItemData)
        }
        context.orderItemDatas = orderItemDatas
    }
}
if (shipment && selectFromShipmentPlan) {
    shipmentPlans = from("OrderShipment").where("shipmentId", shipment.shipmentId).orderBy("orderId", "orderItemSeqId").queryList()
    orderItemDatas = [] as LinkedList

    context.isSalesOrder = true
    shipmentPlans.each { shipmentPlan ->
        orderItemData = [:]
        orderItem = shipmentPlan.getRelatedOne("OrderItem", false)

        orderItemShipGroup = null
        if (shipGroupSeqId) {
            orderItemShipGroup = from("OrderItemShipGroup").where("orderId", orderItem.orderId, "shipGroupSeqId", shipGroupSeqId).queryOne()
            context.orderItemShipGroup = orderItemShipGroup
        }

        oiasgaLimitMap = null
        if (orderItemShipGroup) {
            oiasgaLimitMap = [shipGroupSeqId : shipGroupSeqId]
        }

        orderItemShipGroupAssoc = null
        orderItemShipGroupAssocs = orderItem.getRelated("OrderItemShipGroupAssoc", oiasgaLimitMap, null, false)
        if (orderItemShipGroupAssocs) {
            orderItemShipGroupAssoc = EntityUtil.getFirst(orderItemShipGroupAssocs)
        }
        plannedQuantity = shipmentPlan.getDouble("quantity")
        totalProposedQuantity = 0.0

        product = orderItem.getRelatedOne("Product", false)

        itemIssuances = orderItem.getRelated("ItemIssuance", null, null, false)
        totalQuantityIssued = 0
        totalQuantityIssuedInShipment = 0
        itemIssuances.each { itemIssuance ->
            if (itemIssuance.quantity) {
                totalQuantityIssued += itemIssuance.getDouble("quantity")
            }
            if (itemIssuance.cancelQuantity) {
                totalQuantityIssued -= itemIssuance.getDouble("cancelQuantity")
            }
            if (itemIssuance.shipmentId && itemIssuance.shipmentId.equals(shipmentId)) {
                totalQuantityIssuedInShipment += itemIssuance.getDouble("quantity")
                if (itemIssuance.cancelQuantity) {
                    totalQuantityIssuedInShipment -= itemIssuance.getDouble("cancelQuantity")
                }
            }
        }

        orderItemShipGrpInvResList = orderItem.getRelated("OrderItemShipGrpInvRes", null, ['reservedDatetime'], false)
        orderItemShipGrpInvResDatas = [] as LinkedList
        totalQuantityReserved = 0
        orderItemShipGrpInvResList.each { orderItemShipGrpInvRes ->
            inventoryItem = orderItemShipGrpInvRes.getRelatedOne("InventoryItem", false)
            orderItemShipGrpInvResData = [:]
            orderItemShipGrpInvResData.orderItemShipGrpInvRes = orderItemShipGrpInvRes
            orderItemShipGrpInvResData.inventoryItem = inventoryItem
            orderItemShipGrpInvResData.inventoryItemFacility = inventoryItem.getRelatedOne("Facility", false)
            orderItemShipGrpInvResDatas.add(orderItemShipGrpInvResData)

            reservedQuantity = 0.0
            quantityNotAvailable = 0.0
            proposedQuantity = 0.0
            if (orderItemShipGrpInvRes.quantity) {
                reservedQuantity = orderItemShipGrpInvRes.getDouble("quantity")
                totalQuantityReserved += reservedQuantity
            }
            if (orderItemShipGrpInvRes.quantityNotAvailable) {
                quantityNotAvailable = orderItemShipGrpInvRes.getDouble("quantityNotAvailable")
            }
            proposedQuantity = reservedQuantity - quantityNotAvailable
            if (plannedQuantity - totalProposedQuantity < proposedQuantity) {
                proposedQuantity = plannedQuantity - totalProposedQuantity
            }
            if (proposedQuantity < 0) {
                proposedQuantity = 0.0
            }
            totalProposedQuantity += proposedQuantity
            orderItemShipGrpInvResData.shipmentPlanQuantity = proposedQuantity
        }

        orderItemShipGroupAssocMap = new HashMap(orderItemShipGroupAssoc)
        orderItemShipGroupAssocMap.quantity = orderItemShipGroupAssoc.getDouble("quantity")
        orderItemData.orderItemAndShipGroupAssoc = orderItemShipGroupAssocMap
        orderItemData.orderItemShipGrpInvResDatas = orderItemShipGrpInvResDatas
        orderItemData.totalQuantityReserved = totalQuantityReserved
        orderItemData.totalQuantityIssuedAndReserved = totalQuantityReserved + totalQuantityIssued
        orderItemData.orderItem = orderItem
        orderItemData.product = product
        orderItemData.itemIssuances = itemIssuances
        orderItemData.totalQuantityIssued = totalQuantityIssued
        orderItemDatas.add(orderItemData)
    }
    context.orderItemDatas = orderItemDatas
}
context.shipmentId = shipmentId
context.shipment = shipment
context.orderId = orderId
context.shipGroupSeqId = shipGroupSeqId
