/*
* 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.apache.ofbiz.entity.util.EntityUtil
import org.apache.ofbiz.entity.condition.EntityCondition
import org.apache.ofbiz.entity.condition.EntityOperator

custRequestList = []
custAndWorkEffortList = []
revisionList = []
listIt = []
//for productId and custRequestId
if ((parameters.productId != null)||(parameters.custRequestId != null)||(parameters.workEffortId != null)||(viewIndex > 0)) {
    orList =  []
    orList.add(EntityCondition.makeCondition("custRequestTypeId", EntityOperator.EQUALS, "RF_PROD_BACKLOG"))
    orList.add(EntityCondition.makeCondition("custRequestTypeId", EntityOperator.EQUALS, "RF_UNPLAN_BACKLOG"))
    andList = []
    if (parameters.productId) {
        andList.add(EntityCondition.makeCondition("productId", EntityOperator.LIKE, parameters.productId + "%"))
    }
    if (parameters.custRequestId) {
        andList.add(EntityCondition.makeCondition("custRequestId", EntityOperator.LIKE, parameters.custRequestId + "%"))
    }
    andList.add(EntityCondition.makeCondition(orList, EntityOperator.OR))
    custRequestCond = EntityCondition.makeCondition(andList, EntityOperator.AND)
    custRequestList = from("CustRequestAndCustRequestItem").where(custRequestCond).queryList()
    
    custRequestIds = EntityUtil.getFieldListFromEntityList(custRequestList, "custRequestId", true)
    taskOrList =  []
    taskOrList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "SCRUM_TASK_ERROR"))
    taskOrList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "SCRUM_TASK_TEST"))
    taskOrList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "SCRUM_TASK_IMPL"))
    taskOrList.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, "SCRUM_TASK_INST"))
    taskAndList = []
    taskAndList.add(EntityCondition.makeCondition("custRequestId", EntityOperator.IN, custRequestIds))
    taskAndList.add(EntityCondition.makeCondition(taskOrList, EntityOperator.OR))
    custAndWorkEffortCond = EntityCondition.makeCondition(taskAndList, EntityOperator.AND)
    custAndWorkEffortList = from("CustRequestAndWorkEffort").where(custAndWorkEffortCond).queryList()
    
    //for workEffortId
    workEffortIds = EntityUtil.getFieldListFromEntityList(custAndWorkEffortList, "workEffortId", true)
    revisionAndList = []
    if (parameters.workEffortId) {
        revisionAndList.add(EntityCondition.makeCondition("workEffortId", EntityOperator.LIKE, parameters.workEffortId + "%"))
    } else {
        revisionAndList.add(EntityCondition.makeCondition("workEffortId", EntityOperator.IN, workEffortIds))
    }
    revisionAndList.add(EntityCondition.makeCondition("workEffortContentTypeId", EntityOperator.EQUALS, "TASK_SUB_INFO"))
    revisionCond = EntityCondition.makeCondition(revisionAndList, EntityOperator.AND)
    revisionList = from("WorkEffortAndContentDataResource").where(revisionCond).orderBy("-fromDate").queryList()
    
    if (revisionList) {
        revisionList.each { revisionMap ->
            inputMap = [:]
            inputMap.workEffortId = revisionMap.workEffortId
            inputMap.contentId = revisionMap.contentId
            inputMap.fromDate = revisionMap.fromDate
            inputMap.contentName = revisionMap.contentName
            inputMap.description = revisionMap.description
            inputMap.drObjectInfo = revisionMap.drObjectInfo
            custAndWorkEfffList = from("CustRequestAndWorkEffort").where("workEffortId", revisionMap.workEffortId).queryList()
            if (custAndWorkEfffList) {
                custAndWorkEfffMap = custAndWorkEfffList[0]
                custAndCustItemList = from("CustRequestAndCustRequestItem").where("custRequestId", custAndWorkEfffMap.custRequestId).queryList()
                if (custAndCustItemList) {
                    custAndCustItemMap = custAndCustItemList[0]
                    inputMap.productId = custAndCustItemMap.productId
                    inputMap.custRequestId = custAndCustItemMap.custRequestId
                    }
                }
            listIt.add(inputMap)
        }
        context.listIt = listIt
    }
}
