/*
* 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.util.*;
import java.lang.*;
import javolution.util.FastList;
import org.apache.tools.ant.taskdefs.Parallel.TaskList;
import org.ofbiz.base.util.*;
import org.ofbiz.entity.*;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.entity.util.*;
import org.ofbiz.entity.condition.*;
import java.sql.Timestamp;

taskId = parameters.taskId;;
taskName = parameters.taskName;
sprintId = parameters.sprintId;
sprintName = parameters.sprintName;
taskTypeId = parameters.taskTypeId;
projectId = parameters.projectId;
projectName = parameters.projectName;
backlogTypeId = parameters.unplannedFlag;
statusId = parameters.statusId;
partyId = parameters.partyId;

unplannedTaskList = [];
plannedTaskList = [];
resultList=[];
taskList=[];
implementTaskList=[];
testTaskList=[];
errorTaskList = [];
installTaskList = [];

// get Unplaned task list
if ((taskId != null)||(taskName != null)||(taskTypeId != null)||(sprintId != null)||(sprintName != null)
    ||(projectId != null)||(projectName != null)||(backlogTypeId != null)||(statusId != null)
    ||(partyId != null)||(viewIndex_1 > 0)||(viewIndex_2 > 0)||(viewIndex_3 > 0)||(viewIndex_4 > 0)
    ||(viewIndexNo_1 > 0)||(viewIndexNo_2 > 0)||(viewIndexNo_3 > 0)||(viewIndexNo_4 > 0)){
    if ((taskId != null)||(taskName != null)||(taskTypeId != null)){
        exprBldr =  FastList.newInstance();
        if (taskId) {
            exprBldr.add(EntityCondition.makeCondition("workEffortId", EntityOperator.EQUALS, taskId));
        }
        if (taskName){
            exprBldr.add(EntityCondition.makeCondition("workEffortName", EntityOperator.LIKE, "%"+taskName+"%"));
        }
        if (taskTypeId){
            exprBldr.add(EntityCondition.makeCondition("workEffortTypeId", EntityOperator.EQUALS, taskTypeId));
        }
        if (statusId){
            exprBldr.add(EntityCondition.makeCondition("currentStatusId", EntityOperator.EQUALS, statusId));
        }
        unplannedTaskList = from("UnPlannedBacklogsAndTasks").where(exprBldr).orderBy("-createdDate").queryList();
    }
    else{
        unplannedTaskList = from("UnPlannedBacklogsAndTasks").orderBy("-createdDate").queryList();
    }
    
    exprBldr2 =  FastList.newInstance();
    if (taskId) {
        exprBldr2.add(EntityCondition.makeCondition("taskId", EntityOperator.EQUALS, taskId));
    }
    if (taskName){
        exprBldr2.add(EntityCondition.makeCondition("taskName", EntityOperator.LIKE, "%"+taskName+"%"));
    }
    if (taskTypeId){
        exprBldr2.add(EntityCondition.makeCondition("taskTypeId", EntityOperator.EQUALS, taskTypeId));
    }
    if (statusId){
        exprBldr2.add(EntityCondition.makeCondition("taskCurrentStatusId", EntityOperator.EQUALS, statusId));
    }
    if (sprintId){
        exprBldr2.add(EntityCondition.makeCondition("sprintId", EntityOperator.EQUALS, sprintId));
    }
    if (sprintName){
        exprBldr2.add(EntityCondition.makeCondition("sprintName", EntityOperator.LIKE, "%"+sprintName+"%"));
    }
    if (projectId){
        exprBldr2.add(EntityCondition.makeCondition("projectId", EntityOperator.EQUALS, projectId));
    }
    if (projectName){
        exprBldr2.add(EntityCondition.makeCondition("projectName", EntityOperator.LIKE, "%"+projectName+"%"));
    }
    exprBldr2.add(EntityCondition.makeCondition("sprintTypeId", EntityOperator.EQUALS, "SCRUM_SPRINT"));
    plannedTaskList = from("ProjectSprintBacklogAndTask").where(exprBldr2).orderBy("-taskCreatedDate").queryList();
    
    unplannedTaskList.each{ unplannedTaskMap ->
        unplannedMap = [:];
        unplannedMap.taskId = unplannedTaskMap.workEffortId;
        unplannedMap.sprintId = null;
        unplannedMap.projectId = null;
        unplannedMap.productId = unplannedTaskMap.productId;
        unplannedMap.taskName = unplannedTaskMap.workEffortName;
        unplannedMap.taskTypeId = unplannedTaskMap.workEffortTypeId;
        unplannedMap.taskCurrentStatusId = unplannedTaskMap.currentStatusId;
        unplannedMap.taskEstimatedMilliSeconds = unplannedTaskMap.estimatedMilliSeconds;
        unplannedMap.taskCreatedDate = unplannedTaskMap.createdDate;
        unplannedMap.custRequestId = unplannedTaskMap.custRequestId;
        unplannedMap.description = unplannedTaskMap.description;
        unplannedMap.custRequestTypeId = unplannedTaskMap.custRequestTypeId;
        unplannedMap.taskActualMilliSeconds = unplannedTaskMap.actualMilliSeconds;
        unplannedMap.taskEstimatedStartDate = unplannedTaskMap.estimatedStartDate;
        taskList.add(unplannedMap);
    }
    
    plannedTaskList.each{ plannedTaskMap ->
        plannedMap = [:];
        plannedMap.taskId = plannedTaskMap.taskId;
        plannedMap.taskName = plannedTaskMap.taskName;
        plannedMap.taskTypeId = plannedTaskMap.taskTypeId;
        plannedMap.taskCurrentStatusId = plannedTaskMap.taskCurrentStatusId;
        plannedMap.taskEstimatedMilliSeconds = plannedTaskMap.taskEstimatedMilliSeconds;
        plannedMap.taskCreatedDate = plannedTaskMap.taskCreatedDate;
        plannedMap.sprintId = plannedTaskMap.sprintId;
        plannedMap.sprintName = plannedTaskMap.sprintName;
        plannedMap.projectId = plannedTaskMap.projectId;
        plannedMap.projectName = plannedTaskMap.projectName;
        plannedMap.custRequestId = plannedTaskMap.custRequestId;
        plannedMap.description = plannedTaskMap.description;
        plannedMap.custRequestTypeId = plannedTaskMap.custRequestTypeId;
        plannedMap.taskActualMilliSeconds = plannedTaskMap.taskActualMilliSeconds;
        plannedMap.taskEstimatedStartDate = plannedTaskMap.taskEstimatedStartDate;
        taskList.add(plannedMap);
    }
    //Check the backlog
    if (backlogTypeId){
        if (backlogTypeId=="Y"){
            taskList.each{taskMap ->
                if(taskMap.custRequestTypeId=="RF_UNPLAN_BACKLOG"){
                    resultList.add(taskMap);
                }
            }
        }
        if (backlogTypeId=="N"){
            taskList.each{taskMap ->
                if(taskMap.custRequestTypeId=="RF_PROD_BACKLOG"){
                    resultList.add(taskMap);
                }
            }
        }
    } else {
        taskList.each { taskMap ->
            resultList.add(taskMap);
            }
    }
    // Check party assigned
    if (partyId){
        assignedList = resultList;
        resultList = [];
        assignedList.each { assignedMap ->
            workEffortId = assignedMap.taskId;
            assignToList = from("WorkEffortPartyAssignment").where("workEffortId", workEffortId, "partyId", partyId).queryList();
            if (assignToList) {
                assignedMap.partyId = assignToList[0].partyId;
                resultList.add(assignedMap);
            }
       }
    } else {
        assignedList = resultList;
        resultList = [];
        assignedList.each { assignedMap ->
            workEffortId = assignedMap.taskId;
            assignToList = from("WorkEffortPartyAssignment").where("workEffortId", workEffortId).queryList();
            if (assignToList) {
                assignedMap.partyId = assignToList[0].partyId;
                resultList.add(assignedMap);
            } else {
                resultList.add(assignedMap);
            }
       }
    }
    
    resultList.each{resultMap ->
        if (resultMap.taskTypeId=="SCRUM_TASK_IMPL"){
            implementTaskList.add(resultMap);
        }
        if (resultMap.taskTypeId=="SCRUM_TASK_INST"){
            installTaskList.add(resultMap);
        }
        if (resultMap.taskTypeId=="SCRUM_TASK_TEST"){
            testTaskList.add(resultMap);
        }
        if (resultMap.taskTypeId=="SCRUM_TASK_ERROR"){
            errorTaskList.add(resultMap);
        }
    }
    
    if (implementTaskList){
        context.implementTaskList = implementTaskList;
    }
    if (installTaskList){
        context.installTaskList = installTaskList;
    }
    if (testTaskList){
        context.testTaskList = testTaskList;
    }
    if (errorTaskList){
        context.errorTaskList = errorTaskList;
    }
}
