/*
 * Licensed 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.
 */
package org.apache.sling.resource.filter;

import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Stream;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.resource.filter.ResourceFilterStream;


/**
 * Creates a {@link Predicate} of type {@link Resource} to identify matching
 * Resource objects
 *
 */
public class ResourceFilterStream {

    private ResourceStream resources;

    private ResourceFilter resourceFilter;

    private Predicate<Resource> branchSelector = resource -> true;

    private Predicate<Resource> childSelector = resource -> true;

    public ResourceFilterStream(Resource resource, ResourceFilter filter) {
        resources = new ResourceStream(resource);
        this.resourceFilter = filter;
    }

    /**
     * Creates a Stream<Resource> using the branchSelector to create the traversal
     * predicate to select the appropriate child resources
     * 
     * @param branchSelector
     *            resourceFilter script for traversal control
     * @return ResourceStream
     * @throws ParseException
     */
    public ResourceFilterStream setBranchSelector(String branchSelector) throws ResourceFilterException {
        this.branchSelector = resourceFilter.parse(branchSelector);
        return this;
    }

    /**
     * Creates a Stream<Resource> using the branchSelector to create the traversal
     * predicate to select the appropriate child resources
     * 
     * @param branchSelector
     *            resourceFilter script for traversal control
     * @param charEncoding
     *            char encoding of the branch selector String
     * @return ResourceStream
     * @throws ParseException
     */
    public ResourceFilterStream setChildSelector(String childSelector) throws ResourceFilterException {
        this.childSelector = resourceFilter.parse(childSelector);
        return this;
    }

    /**
     * Add a key - value pair that can then be evaluated as part of the Script
     * 
     * @param params
     * @return
     */
    public ResourceFilterStream addParam(String key, Object value) {
        resourceFilter.addParam(key, value);
        return this;
    }

    /**
     * Add a series of key - value pairs that can then be evaluated as part of the
     * ScriptFilter
     * 
     * @param params
     * @return
     */
    public ResourceFilterStream addParams(Map<String, Object> params) {
        resourceFilter.addParams(params);
        return this;
    }

    public Stream<Resource> stream() {
        return resources.stream(branchSelector).filter(childSelector);
    }
}
