/*
 * 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.
 */

productId = request.getParameter("productId")
if (!productId) {
    productId = session.getAttribute("productId")
}

if (productId) {
    product = from("Product").where("productId", productId).cache(true).queryOne()
    context.product = product

    facilityId = request.getParameter("facilityId")
    resultOutput = runService('getInventoryAvailableByFacility', [productId : productId, facilityId : facilityId])
    quantitySummary = [:]
    quantitySummary.facilityId = facilityId
    quantitySummary.atp_qoh = ((Double)resultOutput.availableToPromiseTotal).intValue() + " / " +
            ((Double)resultOutput.quantityOnHandTotal).intValue()
    context.quantitySummary = quantitySummary

    // For now this just generates a visual list of locations set against the product for this facility.
    // todo: Will need to be able to edit and change these values at some point in the future.
    productFacilityLocList = from("ProductFacilityLocation").where("productId", productId, "facilityId", facilityId).queryList()
    facStr = null
    productFacilityLocList.each { facilityLoc ->
        if (!facStr) {
            facStr = facilityLoc.locationSeqId
        } else {
            facStr = facStr + ", " + facilityLoc.locationSeqId
        }
    }
    context.productFacilityLocations = facStr


    // Now we build a list of locations for inventory items against the facility.
    // todo: change this to a select from inv_items where productId and facilityId matches distinct (locationSeqId).
    invItemList = from("InventoryItem").where("productId", productId, "facilityId", facilityId).queryList()

    locations = [:]

    boolean negativeQOH = false
    invItemList.each { invItem ->
        int qoh = ((Double)invItem.quantityOnHandTotal).intValue()
        if (qoh < 0) {
            negativeQOH = true
        }
        locationFound = (String)invItem.locationSeqId
        if (!locationFound) {
            locationFound = "nullField"
        }
        if (!locations.get(locationFound)) {
            locations.put(locationFound, locationFound)
        }
    }

    // Go through and build the list of atp/qoh against each location
    productFacilityLocations = new ArrayList()
    locationsIter = locations.keySet().iterator()
    while (locationsIter.hasNext()) {
        location = locationsIter.next()
        resultOutput = runService('getInventoryAvailableByLocation', [productId : productId, facilityId : facilityId, locationSeqId : location])
        quantitySummary = [:]
        quantitySummary.productId = productId
        quantitySummary.facilityId = facilityId
        if ("nullField".equals( location ) == true) {
            quantitySummary.locationSeqId = ""
        } else {
            quantitySummary.locationSeqId = location
        }
        quantitySummary.atp_qoh = ((Double)resultOutput.availableToPromiseTotal).intValue() + " / " +
                ((Double)resultOutput.quantityOnHandTotal).intValue()
        productFacilityLocations.add(quantitySummary)
    }

    context.productQtyByLocations = productFacilityLocations
    if (negativeQOH) {
        context.negativeQOH = "true"
    }
}
