/*
 * 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.math.BigDecimal;
import java.util.*;
import java.sql.Timestamp;
import org.ofbiz.entity.*;
import org.ofbiz.entity.condition.*;
import org.ofbiz.entity.util.*;
import org.ofbiz.base.util.*;

BigDecimal calcItemTotal(List headers) {
    BigDecimal total = BigDecimal.ZERO;
    headers.each { header ->
        total = total.plus(header.grandTotal ?: BigDecimal.ZERO);
    }
    return total;
}

double calcItemCount(List items) {
    double count = 0.00;
    items.each { item ->
        count += item.quantity ?: 0.00;
    }
    return count;
}

dayBegin = UtilDateTime.getDayStart(nowTimestamp, timeZone, locale);
weekBegin = UtilDateTime.getWeekStart(nowTimestamp, timeZone, locale);
monthBegin = UtilDateTime.getMonthStart(nowTimestamp, timeZone, locale);
yearBegin = UtilDateTime.getYearStart(nowTimestamp, timeZone, locale);

dayEnd = UtilDateTime.getDayEnd(nowTimestamp, timeZone, locale);
weekEnd = UtilDateTime.getWeekEnd(nowTimestamp, timeZone, locale);
monthEnd = UtilDateTime.getMonthEnd(nowTimestamp, timeZone, locale);
yearEnd = UtilDateTime.getYearEnd(nowTimestamp, timeZone, locale);

// order status report
ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("orderItemSeqId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("orderPaymentPreferenceId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.GREATER_THAN_EQUAL_TO, dayBegin),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.LESS_THAN_EQUAL_TO, dayEnd)],
                    EntityOperator.AND);
dayList = from("OrderStatus").where(ecl).queryList();
context.dayOrder = EntityUtil.filterByAnd(dayList, [statusId : "ORDER_CREATED"]);
context.dayApprove = EntityUtil.filterByAnd(dayList, [statusId : "ORDER_APPROVED"]);
context.dayComplete = EntityUtil.filterByAnd(dayList, [statusId : "ORDER_COMPLETED"]);
context.dayCancelled = EntityUtil.filterByAnd(dayList, [statusId : "ORDER_CANCELLED"]);
context.dayRejected = EntityUtil.filterByAnd(dayList, [statusId : "ORDER_REJECTED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("orderItemSeqId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("orderPaymentPreferenceId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.GREATER_THAN_EQUAL_TO, weekBegin),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.LESS_THAN_EQUAL_TO, weekEnd)],
                    EntityOperator.AND);
weekList = from("OrderStatus").where(ecl).queryList();
context.weekOrder = EntityUtil.filterByAnd(weekList, [statusId : "ORDER_CREATED"]);
context.weekApprove = EntityUtil.filterByAnd(weekList, [statusId: "ORDER_APPROVED"]);
context.weekComplete = EntityUtil.filterByAnd(weekList, [statusId : "ORDER_COMPLETED"]);
context.weekCancelled = EntityUtil.filterByAnd(weekList, [statusId : "ORDER_CANCELLED"]);
context.weekRejected = EntityUtil.filterByAnd(weekList, [statusId : "ORDER_REJECTED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("orderItemSeqId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("orderPaymentPreferenceId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.GREATER_THAN_EQUAL_TO, monthBegin),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.LESS_THAN_EQUAL_TO, monthEnd)],
                    EntityOperator.AND);
monthList = from("OrderStatus").where(ecl).queryList();
context.monthOrder = EntityUtil.filterByAnd(monthList, [statusId : "ORDER_CREATED"]);
context.monthApprove = EntityUtil.filterByAnd(monthList, [statusId : "ORDER_APPROVED"]);
context.monthComplete = EntityUtil.filterByAnd(monthList, [statusId : "ORDER_COMPLETED"]);
context.monthCancelled = EntityUtil.filterByAnd(monthList, [statusId : "ORDER_CANCELLED"]);
context.monthRejected = EntityUtil.filterByAnd(monthList, [statusId : "ORDER_REJECTED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("orderItemSeqId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("orderPaymentPreferenceId", EntityOperator.EQUALS, null),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.GREATER_THAN_EQUAL_TO, yearBegin),
                        EntityCondition.makeCondition("statusDatetime", EntityOperator.LESS_THAN_EQUAL_TO, yearEnd)],
                    EntityOperator.AND);
yearList = from("OrderStatus").where(ecl).queryList();
context.yearOrder = EntityUtil.filterByAnd(yearList, [statusId : "ORDER_CREATED"]);
context.yearApprove = EntityUtil.filterByAnd(yearList, [statusId : "ORDER_APPROVED"]);
context.yearComplete = EntityUtil.filterByAnd(yearList, [statusId : "ORDER_COMPLETED"]);
context.yearCancelled = EntityUtil.filterByAnd(yearList, [statusId : "ORDER_CANCELLED"]);
context.yearRejected = EntityUtil.filterByAnd(yearList, [statusId : "ORDER_REJECTED"]);

// order totals and item counts
ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_REJECTED"),
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, dayBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, dayEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
dayItems = from("OrderHeaderAndItems").where(ecl).queryList();
dayItemsPending = EntityUtil.filterByAnd(dayItems, [itemStatusId : "ITEM_ORDERED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_REJECTED"),
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, dayBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, dayEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
dayHeaders = from("OrderHeader").where(ecl).queryList();
dayHeadersPending = EntityUtil.filterByAnd(dayHeaders, [statusId : "ORDER_CREATED"]);

dayItemTotal = calcItemTotal(dayHeaders);
dayItemCount = calcItemCount(dayItems);
dayItemTotalPending = calcItemTotal(dayHeadersPending);
dayItemCountPending = calcItemCount(dayItemsPending);
dayItemTotalPaid = dayItemTotal - dayItemTotalPending;
dayItemCountPaid = dayItemCount - dayItemCountPending;
context.dayItemTotal = dayItemTotal;
context.dayItemCount = dayItemCount;
context.dayItemTotalPending = dayItemTotalPending;
context.dayItemCountPending = dayItemCountPending;
context.dayItemTotalPaid = dayItemTotalPaid;
context.dayItemCountPaid = dayItemCountPaid;

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_REJECTED"),
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, weekBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, weekEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
weekItems = from("OrderHeaderAndItems").where(ecl).queryList();
weekItemsPending = EntityUtil.filterByAnd(weekItems, [itemStatusId : "ITEM_ORDERED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_REJECTED"),
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, weekBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, weekEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
weekHeaders = from("OrderHeader").where(ecl).queryList();
weekHeadersPending = EntityUtil.filterByAnd(weekHeaders, [statusId : "ORDER_CREATED"]);

weekItemTotal = calcItemTotal(weekHeaders);
weekItemCount = calcItemCount(weekItems);
weekItemTotalPending = calcItemTotal(weekHeadersPending);
weekItemCountPending = calcItemCount(weekItemsPending);
weekItemTotalPaid = weekItemTotal - weekItemTotalPending;
weekItemCountPaid = weekItemCount - weekItemCountPending;
context.weekItemTotal = weekItemTotal;
context.weekItemCount = weekItemCount;
context.weekItemTotalPending = weekItemTotalPending;
context.weekItemCountPending = weekItemCountPending;
context.weekItemTotalPaid = weekItemTotalPaid;
context.weekItemCountPaid = weekItemCountPaid;

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_REJECTED"),
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, monthBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, monthEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
monthItems = from("OrderHeaderAndItems").where(ecl).queryList()
monthItemsPending = EntityUtil.filterByAnd(monthItems, [itemStatusId : "ITEM_ORDERED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_REJECTED"),
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, monthBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, monthEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
monthHeaders = from("OrderHeader").where(ecl).queryList();
monthHeadersPending = EntityUtil.filterByAnd(monthHeaders, [statusId : "ORDER_CREATED"]);

monthItemTotal = calcItemTotal(monthHeaders);
monthItemCount = calcItemCount(monthItems);
monthItemTotalPending = calcItemTotal(monthHeadersPending);
monthItemCountPending = calcItemCount(monthItemsPending);
monthItemTotalPaid = monthItemTotal - monthItemTotalPending;
monthItemCountPaid = monthItemCount - monthItemCountPending;
context.monthItemTotal = monthItemTotal;
context.monthItemCount = monthItemCount;
context.monthItemTotalPending = monthItemTotalPending;
context.monthItemCountPending = monthItemCountPending;
context.monthItemTotalPaid = monthItemTotalPaid;
context.monthItemCountPaid = monthItemCountPaid;

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_REJECTED"),
                        EntityCondition.makeCondition("itemStatusId", EntityOperator.NOT_EQUAL, "ITEM_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, yearBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, yearEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
yearItems = from("OrderHeaderAndItems").where(ecl).queryList();
yearItemsPending = EntityUtil.filterByAnd(yearItems, [itemStatusId : "ITEM_ORDERED"]);

ecl = EntityCondition.makeCondition([
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_REJECTED"),
                        EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "ORDER_CANCELLED"),
                        EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, yearBegin),
                        EntityCondition.makeCondition("orderDate", EntityOperator.LESS_THAN_EQUAL_TO, yearEnd),
                        EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER")],
                    EntityOperator.AND);
yearHeaders = from("OrderHeader").where(ecl).queryList();
yearHeadersPending = EntityUtil.filterByAnd(yearHeaders, [statusId : "ORDER_CREATED"]);

yearItemTotal = calcItemTotal(yearHeaders);
yearItemCount = calcItemCount(yearItems);
yearItemTotalPending = calcItemTotal(yearHeadersPending);
yearItemCountPending = calcItemCount(yearItemsPending);
yearItemTotalPaid = yearItemTotal - yearItemTotalPending;
yearItemCountPaid = yearItemCount - yearItemCountPending;
context.yearItemTotal = yearItemTotal;
context.yearItemCount = yearItemCount;
context.yearItemTotalPending = yearItemTotalPending;
context.yearItemCountPending = yearItemCountPending;
context.yearItemTotalPaid = yearItemTotalPaid;
context.yearItemCountPaid = yearItemCountPaid;

// order state report
waitingPayment = from("OrderHeader").where("statusId", "ORDER_CREATED", "orderTypeId", "SALES_ORDER").queryList();
context.waitingPayment = waitingPayment.size();

waitingApproval = from("OrderHeader").where("statusId", "ORDER_PROCESSING", "orderTypeId", "SALES_ORDER").queryList();
context.waitingApproval = waitingApproval.size();

waitingComplete = from("OrderHeader").where("statusId", "ORDER_APPROVED", "orderTypeId", "SALES_ORDER").queryList();
context.waitingComplete = waitingComplete.size();
