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

// executes only on startup when only the basic parameters.portalPageId (from commonscreens.xml) is available
if (userLogin && parameters.parentPortalPageId && !parameters.portalPageId) {
    // look for system page according the current securitygroup
    //get the security group
    condSec = EntityCondition.makeCondition([
            EntityCondition.makeCondition("portalPageId", EntityOperator.LIKE, parameters.parentPortalPageId + "%"),
            EntityCondition.makeCondition("parentPortalPageId", EntityOperator.EQUALS, null),
            EntityCondition.makeCondition("userLoginId", EntityOperator.EQUALS, userLogin.userLoginId)
            ],EntityOperator.AND)
    portalMainPages = EntityUtil.filterByDate(delegator.findList("PortalPageAndUserLogin", condSec, null, null, null, false))
    if (!portalMainPages) { // look for a null securityGroup if not found
        condSec = EntityCondition.makeCondition([
            EntityCondition.makeCondition("securityGroupId", EntityOperator.EQUALS, null),
            EntityCondition.makeCondition("parentPortalPageId", EntityOperator.EQUALS, null),
            EntityCondition.makeCondition("portalPageId", EntityOperator.LIKE, parameters.parentPortalPageId + "%")
            ],EntityOperator.AND)
        portalMainPages = delegator.findList("PortalPage", condSec, null, null, null, false)
    }
    if (portalMainPages) {
        portalPageId = portalMainPages.get(0).portalPageId
        // check if overridden with a privat page
        privatMainPages = delegator.findByAnd("PortalPage", [originalPortalPageId : portalPageId, ownerUserLoginId : userLogin.userLoginId], null, false)
        if (privatMainPages) {
            context.parameters.portalPageId = privatMainPages.get(0).portalPageId
        } else {
            context.parameters.portalPageId = portalPageId
        }
    }
}
// Debug.log('======portalPageId: ' + parameters.portalPageId)
if (userLogin && parameters.portalPageId) {
    portalPage = delegator.findOne("PortalPage", [portalPageId : parameters.portalPageId], false)
    if (portalPage) {
        if (portalPage.parentPortalPageId) {
            context.parameters.parentPortalPageId = portalPage.parentPortalPageId
        } else {
            if ("_NA_".equals(portalPage.ownerUserLoginId)) {
                context.parameters.parentPortalPageId = portalPage.portalPageId
            } else {
                context.parameters.parentPortalPageId = portalPage.originalPortalPageId
            }
        }
    }
}
// Debug.log('======parent portalPageId: ' + parameters.parentPortalPageId)
if (!context.headerItem && parameters.portalPageId) {
    context.headerItem = parameters.portalPageId // and the menu item is highlighted
}
