/*
 * 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 java.awt.Dimension
import org.apache.ofbiz.entity.util.*
import org.apache.ofbiz.manufacturing.jobshopmgt.ProductionRun
import org.apache.ofbiz.manufacturing.jobshopmgt.ProductionRunHelper

if (security.hasEntityPermission("MANUFACTURING", "_VIEW", session)) {
    context.hasPermission = Boolean.TRUE
} else {
    context.hasPermission = Boolean.FALSE
}

// -----------------------------
// Report's parameters
selectWorkEffortNameParameter = "O-PREL_A" // sezionatura
selectPrimaryCategoryIdParameter = "CABINETS" // struttura
// -----------------------------

shipmentId = request.getParameter("shipmentId")
context.shipmentId = shipmentId

shipment = delegator.findOne("Shipment", [shipmentId : shipmentId], false)
context.shipment = shipment

// dimensionsByFeatureMap [key=feature; value=productsByShapeMap]
// productsByShapeMap [key=dimension; value=quantityByProductsMap]
// quantityByProductsMap [key=product; value=quantity]
// dimension={width*, height*, qty}
// product={productId*,...}

productIdToQuantity = [:] // key=productId, value=quantity
productIdToProduct = [:] // key=productId, value=product
dimensionToProducts = [:] // key=Dimension, value=list of products
dimensionToQuantity = [:] // key=Dimension, value=tot qty (of products)
    
shipmentPlans = from("OrderShipment").where("shipmentId", shipmentId).queryList()

if (shipmentPlans) {
    shipmentPlans.each { shipmentPlan ->
        // Select the production run, if available
        weIds = from("WorkOrderItemFulfillment").where("orderId", shipmentPlan.orderId, "orderItemSeqId", shipmentPlan.orderItemSeqId).orderBy("workEffortId").queryList() // TODO: add shipmentId
        weId = EntityUtil.getFirst(weIds)
        productionRunTree = [] as ArrayList
        // TODO
        if (weId) {
            ProductionRunHelper.getLinkedProductionRuns(delegator, dispatcher, weId.workEffortId, productionRunTree)
            for (int i = 0; i < productionRunTree.size(); i++) {
                oneProductionRun = (ProductionRun)productionRunTree.get(i)
                if (ProductionRunHelper.hasTask(delegator, selectWorkEffortNameParameter, oneProductionRun.getGenericValue().workEffortId)) {
                    product = oneProductionRun.getProductProduced()
                    primaryCategory = product.primaryProductCategoryId
                    if (primaryCategory && selectPrimaryCategoryIdParameter.equals(primaryCategory)) {
                        productId = product.productId
                        productIdToProduct.put(productId, product)
                        if (!productIdToQuantity.containsKey(productId)) {
                            productIdToQuantity.put(productId, 0.0)
                        }
                        qty = productIdToQuantity.get(productId)
                        productIdToQuantity.put(productId, oneProductionRun.getGenericValue().quantityToProduce + qty)
                    }
                }
            }
        }
    }
    productIdToProduct.values().each { product ->
        heightD = product.productHeight
        height = 0
        if (heightD) {
            height = (heightD * 1000) as int
        }

        widthD = product.productWidth
        width = 0
        if (widthD) {
            width = (widthD * 1000) as int
        }
        Dimension dim = new Dimension(width, height)
        if (!dimensionToProducts.containsKey(dim)) {
            dimensionToProducts.put(dim, new ArrayList())
        }
        prodList = (List)dimensionToProducts.get(dim)
        prodList.add(product)
        // tot qty per dimension
        if (!dimensionToQuantity.containsKey(dim)) {
            dimensionToQuantity.put(dim, 0.0)
        }
        qty = dimensionToQuantity[dim]
        dimensionToQuantity.put(dim, productIdToQuantity[product.productId] + qty)
    }
    //
    //
    //
    list1 = [] as ArrayList
    dimensionToProducts.keySet().each { dim ->
        map1 = [:]
        list1.add(map1)
        map1.width = (dim.getWidth() / 1000)
        map1.height = (dim.getHeight() / 1000)
        map1.quantity = dimensionToQuantity.get(dim)
        list2 = [] as ArrayList
        map1.products = list2
        products = (List)dimensionToProducts.get(dim)
        for (int i = 0; i < products.size(); i++) {
            product = products.get(i)
            Map map2 = [:]
            list2.add(map2)
            map2.product = product
            map2.quantity = productIdToQuantity.get(product.productId)
        }
    }
    context.cuttingList = list1
}