/*
 * 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.
 */

/*
 * For cases when the ApplyFeaturesFromCategory.ftl is actually supposed to get its list of ProductFeatures from a productFeatureGroupId.
 * Puts productFeatureGroup and productFeatures which are put of this group into the context.  Currently does not break out the features by view size.
 */

import org.ofbiz.entity.*

productFeatureGroupId = parameters.get("productFeatureGroupId");
if (productFeatureGroupId) {
    productFeatureGroup = delegator.findOne("ProductFeatureGroup", [productFeatureGroupId : productFeatureGroupId], false);
    productFeatures = [];
    productFeatureGroupAppls = productFeatureGroup.getRelated("ProductFeatureGroupAppl", null, ['sequenceNum'], false);
    for (pFGAi = productFeatureGroupAppls.iterator(); pFGAi;) {
        productFeatureGroupAppl = (GenericEntity)pFGAi.next();
        productFeature = (GenericEntity)productFeatureGroupAppl.getRelatedOne("ProductFeature", false);
        productFeature.set("defaultSequenceNum", productFeatureGroupAppl.getLong("sequenceNum"));
        productFeatures.add(productFeature);
    }
    context.productFeatureGroup = productFeatureGroup;
    context.productFeatures = productFeatures;

    // this will not break out the product features by view size
    context.listSize = productFeatures.size();
    context.highIndex = productFeatures.size();
}
