/*
* 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.base.util.UtilMisc
import org.apache.ofbiz.base.util.Debug
import org.apache.ofbiz.entity.util.*
import org.apache.ofbiz.entity.condition.*

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
    }
}
