/*
 * 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.ofbiz.entity.condition.*;
import org.ofbiz.base.util.*;
import org.ofbiz.entity.util.EntityUtil;

roleTypeId = null;
paramCond = [];
products = [];
productId = parameters.productId;
internalName = parameters.internalName;
statusId = parameters.statusId;
if ("Any".equals(statusId)) {
    statusId = null;
}
partyId = parameters.partyId;

if(!security.hasEntityPermission("SCRUM", "_ADMIN", session)){
    if(security.hasEntityPermission("SCRUM_PRODUCT", "_ADMIN", session)){
        roleTypeId = "PRODUCT_OWNER";
    }
}

if (userLogin) {
    if(UtilValidate.isNotEmpty(partyId)){
        paramCond.add(EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, partyId));
    }
    if(UtilValidate.isNotEmpty(productId)){
        paramCond.add(EntityCondition.makeCondition("productId", EntityOperator.LIKE, productId + "%"));
    }
    if(UtilValidate.isNotEmpty(internalName)){
        paramCond.add(EntityCondition.makeCondition("internalName", EntityOperator.LIKE, "%" + internalName + "%"));
    }
    if(UtilValidate.isNotEmpty(statusId)){
        if ("PRODUCT_ACTIVE".equals(statusId)) {
            paramCond.add(EntityCondition.makeCondition("supportDiscontinuationDate", EntityOperator.EQUALS, null));
        } else {
             paramCond.add(EntityCondition.makeCondition("supportDiscontinuationDate", EntityOperator.NOT_EQUAL, null));
        }
    }
    
    paramCond.add(EntityCondition.makeCondition("productTypeId", EntityOperator.EQUALS, "SCRUM_ITEM"));
    paramCond.add(EntityCondition.makeCondition("roleTypeId", EntityOperator.EQUALS, "PRODUCT_OWNER_COMP"));
    paramCond.add(EntityCondition.makeCondition("thruDate", EntityOperator.EQUALS, null));
    
    allProducts = from("ProductAndRole").where(paramCond).orderBy("groupName", "internalName").queryList();
    
    partyAndSecurityGroupList = select("partyId", "groupId")
                                    .from("ScrumMemberUserLoginAndSecurityGroup").where(EntityCondition.makeCondition([
                                        EntityCondition.makeCondition ("partyId", EntityOperator.EQUALS, userLogin.partyId),
                                        EntityCondition.makeCondition ("partyStatusId", EntityOperator.NOT_EQUAL, "PARTY_DISABLED"),
                                        EntityCondition.makeCondition ("thruDate", EntityOperator.EQUALS, null)
                                    ], EntityJoinOperator.AND))
                                    .orderBy("partyId")
                                    .queryList();
    
    context.partyAndSecurityGroupList = partyAndSecurityGroupList;
    boolean addAllProducts = false;
    allProducts.each { product ->
        product = product.getAllFields();
        productMap = from("Product").where("productId", product.productId).queryOne();
        product.put("longDescription",productMap.longDescription)
        if(security.hasEntityPermission("SCRUM", "_ADMIN", session)){
            addAllProducts = true;
        }else{
            ismember = false;
            if (partyAndSecurityGroupList) {
                groupId = partyAndSecurityGroupList[0].groupId;
                if ("SCRUM_PRODUCT_OWNER".equals(groupId)) {
                    productAndRoleList = from("ProductRole").where("productId", product.productId, "partyId", userLogin.partyId, "thruDate", null).queryList();
                    if (productAndRoleList) {
                        productAndRoleList.each { productAndRoleMap ->
                            productIdInner = productAndRoleMap.productId;
                                if (productIdInner.equals(product.productId)) {
                                    ismember = true;
                                }
                            }
                        }
                } else if ("SCRUM_STAKEHOLDER".equals(groupId)) {
                    // check in company relationship.
                    scrumRolesCond = EntityCondition.makeCondition([
                        EntityCondition.makeCondition ("partyId", EntityOperator.EQUALS, userLogin.partyId),
                        EntityCondition.makeCondition ("roleTypeId", EntityOperator.EQUALS, "STAKEHOLDER"),
                        EntityCondition.makeCondition ("partyStatusId", EntityOperator.NOT_EQUAL, "PARTY_DISABLED"),
                        EntityCondition.makeCondition ("thruDate", EntityOperator.EQUALS, null)
                        ], EntityJoinOperator.AND);
                    scrumRolesPersonAndCompanyList = from("ScrumRolesPersonAndCompany").where(scrumRolesCond).queryList();
                    productRoleList = from("ProductRole").where("partyId", scrumRolesPersonAndCompanyList[0].partyIdFrom, "roleTypeId", "PRODUCT_OWNER_COMP", "thruDate", null).queryList();
                    if (productRoleList) {
                        productRoleList.each { productRoleMap ->
                            stakeholderProduct = productRoleMap.productId;
                            if (stakeholderProduct.equals(product.productId)) {
                                ismember = true;
                            }
                        }
                   }
                   //check in product.
                    if (ismember == false) {
                        productAndRoleList = from("ProductAndRole").where("productId" : product.productId, "partyId" : userLogin.partyId, "roleTypeId" : "STAKEHOLDER", "supportDiscontinuationDate" : null, "thruDate" : null).queryList()
                        if (productAndRoleList) {
                            ismember = true;
                        }
                    }
                } else if ("SCRUM_MASTER".equals(groupId)) {
                    //check in product.
                    productRoleList = [];
                    productRoleList = from("ProductAndRole").where("productId" : product.productId, "partyId" : userLogin.partyId, "roleTypeId" : "SCRUM_MASTER", "supportDiscontinuationDate" : null, "thruDate" : null).queryList();
                    if (productRoleList) {
                        ismember = true;
                    }
                    //check in project.
                    if (ismember == false) {
                        projects = [];
                        projects = from("WorkEffortAndProduct").where("productId", product.productId, "workEffortTypeId", "SCRUM_PROJECT", "currentStatusId", "SPJ_ACTIVE").queryList();
                        if (projects) {
                            projects.each { project ->
                                projectPartyAssignment = from("WorkEffortPartyAssignment").where("partyId", userLogin.partyId, "workEffortId", project.workEffortId).queryList();
                                if (projectPartyAssignment) {
                                    ismember = true;
                                }
                            }
                        }
                    }
                    //check in sprint.
                    if (ismember == false) {
                        projects.each { project ->
                            allSprintList = [];
                            allSprintList = from("WorkEffort").where("workEffortParentId", project.workEffortId, "currentStatusId", "SPRINT_ACTIVE").queryList();
                            allSprintList.each { SprintListMap ->
                                sprintId = SprintListMap.workEffortId;
                                workEffortPartyAssignment = from("WorkEffortPartyAssignment").where("partyId", userLogin.partyId, "workEffortId", sprintId).queryList();
                                if (workEffortPartyAssignment) {
                                    ismember = true;
                                }
                            }
                        }
                    }
                } else {
                    projects = [];
                    projects = from("WorkEffortAndProduct").where("productId", product.productId, "workEffortTypeId", "SCRUM_PROJECT", "currentStatusId", "SPJ_ACTIVE").queryList();
                    if (projects) {
                        projects.each { project ->
                            allSprintList = [];
                            allSprintList = from("WorkEffort").where("workEffortParentId", project.workEffortId, "currentStatusId", "SPRINT_ACTIVE").queryList();
                            allSprintList.each { SprintListMap ->
                                sprintId = SprintListMap.workEffortId;
                                workEffortPartyAssignment = from("WorkEffortPartyAssignment").where("partyId", userLogin.partyId, "workEffortId", sprintId).queryList();
                                if (workEffortPartyAssignment) {
                                    ismember = true;
                                }
                            }
                        }
                    }
                    if (ismember == false) {
                        exprBldr = [EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "CRQ_REVIEWED"),
                                    EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "CRQ_REOPENED")];
                        andExprs = [EntityCondition.makeCondition("productId", EntityOperator.EQUALS, product.productId),
                                    EntityCondition.makeCondition("currentStatusId", EntityOperator.EQUALS, "STS_CREATED"),
                                    EntityCondition.makeCondition(exprBldr, EntityOperator.OR)];
                        unplannedBacklogCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND);
                        unplannedBacklogList = from("UnPlannedBacklogsAndTasks").where(unplannedBacklogCond).queryList();
                        if (unplannedBacklogList) {
                            unplannedBacklogList.each { unplannedMap ->
                                workEffortId = unplannedMap.workEffortId;
                                workEffortPartyAssignment = from("WorkEffortPartyAssignment").where("partyId", userLogin.partyId, "workEffortId", workEffortId).queryList();
                                if (workEffortPartyAssignment) {
                                    ismember = true;
                                }
                            }
                        }
                    }
                }
                
                if (ismember) {
                      products.add(product);
                }
              }
            }
            if(addAllProducts)
                products.add(product);
    }
} else {
    Debug.logError("Party ID missing =========>>> : null ", "");
}

if (products){
    context.listIt = products;
}
