/*
 * 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.ofbiz.order.order.OrderReadHelper;
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.util.EntityUtil;

toPrintOrders = [];
maxNumberOfOrders = parameters.maxNumberOfOrdersToPrint;
int maxNumberOfOrders = maxNumberOfOrders.toInteger();
int printListCounter = 0;
printGroupName = parameters.printGroupName;
if (printGroupName != null) {
    pickMoveInfoList.each { pickMoveInfo ->
        groupName = pickMoveInfo.groupName ;
        if (groupName == printGroupName) {
            toPrintOrders.add(pickMoveInfo.orderReadyToPickInfoList);
        }
    }
}
else {
    pickMoveInfoList.each { pickMoveInfo ->
        toPrintOrders.add(pickMoveInfo.orderReadyToPickInfoList);
    }
}
if (toPrintOrders) {
    orderList = [];
    orderInfoList = [];
    itemInfoList = [];
    orderHeaderList = [];
    orderChargeList =[];
    toPrintOrders.each { toPrintOrder ->
        if(toPrintOrder) {
            orderHeaders = toPrintOrder.orderHeader;
            orderItemShipGroups = toPrintOrder.orderItemShipGroup;
            orderItemShipGrpInvResList = toPrintOrder.orderItemShipGrpInvResList;
            orderItemShipGrpInvResInfoList = toPrintOrder.orderItemShipGrpInvResInfoList;
            orderHeaders.each { orderHeader ->
                printListCounter = ++printListCounter;
                if (printListCounter <= maxNumberOfOrders) {
                    orderMap = [:];
                    orderId = orderHeader.orderId;
                    orderMap.orderId = orderId;
                    orderMap.orderDate = orderHeader.orderDate;
                    billingOrderContactMechs = [];
                    billingOrderContactMechs = delegator.findByAnd("OrderContactMech", [orderId : orderId, contactMechPurposeTypeId : "BILLING_LOCATION"], null, false);
                    if (billingOrderContactMechs.size() > 0) {
                        billingContactMechId = EntityUtil.getFirst(billingOrderContactMechs).contactMechId;
                        billingAddress = delegator.findOne("PostalAddress", [contactMechId : billingContactMechId], false);
                    }
                    shippingContactMechId = EntityUtil.getFirst(delegator.findByAnd("OrderContactMech", [orderId : orderId, contactMechPurposeTypeId : "SHIPPING_LOCATION"], null, false)).contactMechId;
                    shippingAddress = delegator.findOne("PostalAddress", [contactMechId : shippingContactMechId], false);
                    orderItemShipGroups.each { orderItemShipGroup ->
                        if (orderItemShipGroup.orderId == orderId) {
                            orderMap.shipmentMethodType = EntityUtil.getFirst(orderItemShipGroup.getRelated("ShipmentMethodType", null, null, false)).description;
                            orderMap.carrierPartyId = orderItemShipGroup.carrierPartyId;
                            orderMap.shipGroupSeqId = orderItemShipGroup.shipGroupSeqId;
                            orderMap.carrierPartyId = orderItemShipGroup.carrierPartyId;
                            orderMap.isGift = orderItemShipGroup.isGift;
                            orderMap.giftMessage = orderItemShipGroup.giftMessage;
                        }
                        orderMap.shippingAddress = shippingAddress;
                        if (billingOrderContactMechs.size() > 0) {
                            orderMap.billingAddress = billingAddress;
                        }
                        orderInfoMap = [:];
                        orderInfoMap.(orderHeader.orderId) = orderMap;
                    }
                    addInMap = "true";
                    orderItemMap = [:];
                    orderItemShipGrpInvResInfoList.each { orderItemShipGrpInvResInfos ->
                        orderItemShipGrpInvResInfos.each { orderItemShipGrpInvResInfo ->
                            if (orderItemShipGrpInvResInfo.orderItemShipGrpInvRes.orderId == orderId && addInMap == "true") {
                                orderItemMap.(orderHeader.orderId) = orderItemShipGrpInvResInfos;
                                addInMap = "false";
                            }
                        }
                    }
                    orderChargeMap = [:];
                    orderReadHelper = new OrderReadHelper(orderHeader);
                    orderItems = orderReadHelper.getOrderItems();
                    orderAdjustments = orderReadHelper.getAdjustments();
                    orderHeaderAdjustments = orderReadHelper.getOrderHeaderAdjustments();
                    context.orderHeaderAdjustments = orderHeaderAdjustments;
                    orderSubTotal = orderReadHelper.getOrderItemsSubTotal();
                    context.orderSubTotal = orderSubTotal;
                    otherAdjAmount = orderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, true, false, false);
                    shippingAmount = orderReadHelper.getAllOrderItemsAdjustmentsTotal(orderItems, orderAdjustments, false, false, true);
                    shippingAmount = shippingAmount.add(orderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, false, false, true));
                    taxAmount = orderReadHelper.getAllOrderItemsAdjustmentsTotal(orderItems, orderAdjustments, false, true, false);
                    taxAmount = taxAmount.add(orderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, false, true, false));
                    grandTotal = orderReadHelper.getOrderGrandTotal(orderItems, orderAdjustments);
                    orderChargeMap.orderSubTotal = orderSubTotal;
                    orderChargeMap.taxAmount = taxAmount;
                    orderChargeMap.shippingAmount = shippingAmount;
                    orderChargeMap.otherAdjAmount = otherAdjAmount;
                    orderChargeMap.grandTotal = grandTotal;
                    orderChargeMap.totalItem = orderItems.size();
                    orderCharges = [:];
                    orderCharges.(orderHeader.orderId) = orderChargeMap;
                    orderChargeList.add(orderCharges);
                    itemInfoList.add(orderItemMap);
                    orderInfoList.add(orderInfoMap);
                    orderList.add(orderHeader);
                    context.orderHeaderList = orderList;
                    context.orderInfoList = orderInfoList;
                    context.itemInfoList = itemInfoList;
                    context.orderChargeList = orderChargeList;
                }
            }
        }
    }
}
