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

package org.ofbiz.shipment.test;

import java.math.BigDecimal;
import java.util.List;

import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityQuery;
import org.ofbiz.shipment.packing.PackingSession;
import org.ofbiz.service.testtools.OFBizTestCase;

/**
 * Item Issuance Tests
 */
public class IssuanceTest extends OFBizTestCase {

    protected GenericValue userLogin = null;

    public IssuanceTest(String name) {
        super(name);
    }

    @Override
    protected void setUp() throws Exception {
        userLogin = EntityQuery.use(delegator).from("UserLogin").where("userLoginId", "system").queryOne();
    }

    @Override
    protected void tearDown() throws Exception {
    }

    public void testMultipleInventoryItemIssuance() throws Exception {
        String facilityId = "WebStoreWarehouse";
        String productId="GZ-2644";
        String orderId="DEMO81015";
        String orderItemSeqId="00001";
        String shipGroupSeqId="00001";
        String shipmentItemSeqId = "00001";
        
        PackingSession packSession = new PackingSession(dispatcher, userLogin, facilityId, null, orderId, shipGroupSeqId);
        packSession.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, productId, BigDecimal.valueOf(6L), 1,
            BigDecimal.valueOf(1000L), false);
        String shipmentId = packSession.complete(false);

        GenericValue orderHeader = EntityQuery.use(delegator).from("OrderHeader").where("orderId", orderId).cache().queryOne();

        // Test the OrderShipment is correct
        List<GenericValue> orderShipments = orderHeader.getRelated("OrderShipment", null, null, false);
        
        assertFalse("No OrderShipment for order", UtilValidate.isEmpty(orderShipments));
        assertEquals( "Incorrect number of OrderShipments for order", 1, orderShipments.size());
        
        GenericValue orderShipment = orderShipments.get(0);
        assertEquals(orderItemSeqId, orderShipment.getString("orderItemSeqId"));
        assertEquals(shipGroupSeqId, orderShipment.getString("shipGroupSeqId"));
        assertEquals(shipmentId, orderShipment.getString("shipmentId"));
        assertEquals(shipmentItemSeqId, orderShipment.getString("shipmentItemSeqId"));
        BigDecimal actual = orderShipment.getBigDecimal("quantity");
        assertTrue("Incorrect quantity in OrderShipment. Expected 6.00000 actual " + actual, actual.compareTo(BigDecimal.valueOf(6L))==0);

        // Test the ItemIssuances are correct
        List<GenericValue> itemIssuances = orderHeader.getRelated("ItemIssuance", null, UtilMisc.toList("itemIssuanceId"), false);
        assertFalse("No ItemIssuances for order", UtilValidate.isEmpty(itemIssuances));
        assertEquals( "Incorrect number of ItemIssuances for order", 2, itemIssuances.size());
        
        GenericValue itemIssuance = itemIssuances.get(0);
        assertEquals(orderItemSeqId, itemIssuance.getString("orderItemSeqId"));
        assertEquals(shipGroupSeqId, itemIssuance.getString("shipGroupSeqId"));
        assertEquals(shipmentId, itemIssuance.getString("shipmentId"));
        assertEquals(shipmentItemSeqId, itemIssuance.getString("shipmentItemSeqId"));
        assertEquals("9001", itemIssuance.getString("inventoryItemId"));
        actual = itemIssuance.getBigDecimal("quantity");
        assertTrue("Incorrect quantity in ItemIssuance. Expected 5.00000 actual " + actual, actual.compareTo(BigDecimal.valueOf(5L))==0);

        itemIssuance = itemIssuances.get(1);
        assertEquals(orderItemSeqId, itemIssuance.getString("orderItemSeqId"));
        assertEquals(shipGroupSeqId, itemIssuance.getString("shipGroupSeqId"));
        assertEquals(shipmentId, itemIssuance.getString("shipmentId"));
        assertEquals(shipmentItemSeqId, itemIssuance.getString("shipmentItemSeqId"));
        assertEquals("9025", itemIssuance.getString("inventoryItemId"));
        actual = itemIssuance.getBigDecimal("quantity");
        assertTrue("Incorrect quantity in ItemIssuance. Expected 1.00000 actual " + actual, actual.compareTo(BigDecimal.valueOf(1L))==0);

        // Test reservations have been removed
        List<GenericValue> reservations = orderHeader.getRelated("OrderItemShipGrpInvRes", null, null, false);
        assertTrue("Reservations exist for order - should have been deleted", UtilValidate.isEmpty(reservations));
        
        // Test order header status is now ORDER_COMPLETED
        assertEquals(orderHeader.getString("statusId"), "ORDER_COMPLETED");
        
        // Test order items status are now ITEM_COMPLETED
        List<GenericValue> orderItems = orderHeader.getRelated("OrderItem", null, null, false);
        
        for ( GenericValue orderItem : orderItems )
            assertEquals("ITEM_COMPLETED", orderItem.getString("statusId"));
    }
}
