/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.onosproject.config;


import com.google.common.annotations.Beta;
import org.onosproject.yang.model.ResourceId;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * Abstraction for Filters that can be used while traversing the dynamic config store.
 * This abstraction allows to select entries of interest based on various criteria
 * defined by this interface.
 * NOTE: Only criteria based on {@code ResourceId} are supported currently.
 * This is a placeholder for a filter; Set of ResourceId becomes inefficient when
 * using a large number of filtering criteria;
 */
@Beta
public class Filter {
    /**
     * Traversal modes.
     */
    public enum TraversalMode {
        SUB_TREE(-1),
        NODE_ONLY(0),
        GIVEN_DEPTH;
        /**
         * SUB_TREE => if the node points to a subtree, the entire subtree will
         * be traversed; if pointing to a leaf, just the leaf will be retrieved.
         * NODE_ONLY => tree will not be traversed; will retrieve just the
         * specific node, irrespective of it being a subtree root or a leaf node
         * GIVEN_DEPTH => as many levels of the subtree as indicated by depth
         * field of filter that  will be traversed; if depth > the number of
         * levels of children, the entire subtree will be traversed and end
         * the traversal, without throwing any errors.
         */
        int val;
        TraversalMode() {

        }
        TraversalMode(int val) {
            this.val = val;
        }
        int val() {
            return val;
        }
    }

    /** Filtering criteria.
     */
    Set<ResourceId> criteria = new LinkedHashSet<ResourceId>();
    /** Traversal mode; default is to read just the given node(NODE_ONLY).
     */
    TraversalMode mode = TraversalMode.NODE_ONLY;
    /** depth of traversal; default value is 0.
     */
    int depth = TraversalMode.NODE_ONLY.val();

    /**
     * Creates a new Filter object.
     */
    public Filter() {

    }
    /**
     * Creates a new Filter object.
     *
     * @param criteria  set of filtering criteria
     * @param mode traversal mode
     * @param depth depth of traversal
     */
    public Filter(Set<ResourceId> criteria, TraversalMode mode, int depth) {
        this.criteria = criteria;
        this.mode = mode;
        this.depth = depth;

    }

    /**
     * Returns the traversal mode.
     *
     *@return traversal mode
     */
    TraversalMode mode() {
        return mode;
    }

    /**
     * Sets the traversal mode.
     *
     * @param mode traversal mode
     */
    void mode(TraversalMode mode) {
        this.mode = mode;
    }

    /**
     * Returns the depth.
     *
     *@return depth
     */
    int depth() {
        return depth;
    }

    /**
     * Sets the depth.
     *
     * @param depth of traversal
     */
    void mode(int depth) {
        this.depth = depth;
    }
    /**
     * Adds a new ResourceId filtering criterion to a Filter object.
     * If the same ResourceId is already part of the criteria
     * for the object, it will not be added again, but will not throw any exceptions.
     * This will not check for the validity of the ResourceId.
     *
     * @param add new criterion
     */
    void addCriteria(ResourceId add) {
        criteria.add(add);
    }

    /**
     * Adds new ResourceId filtering criteria to a Filter object.
     * If the same ResourceId is already part of the criteria
     * for the object, it will not be added again, but will not throw any exceptions.
     * This will not check for the validity of the ResourceId.
     *
     * @param addAll new criteria
     */
    void addCriteria(Set<ResourceId> addAll) {
        criteria.addAll(addAll);
    }

    /**
     * Removes the given ResourceId filtering criterion from a Filter object.
     * If the ResourceId was NOT already part of the criteria for
     * the object, it will not be removed, but will not throw any exceptions.
     * This will not check for the validity of the ResourceId.
     *
     * @param remove criterion to be removed
     */
    void removeCriteria(ResourceId remove) {
        criteria.remove(remove);
    }

    /**
     * Removes the given ResourceId filtering criteria from a Filter object.
     * If the ResourceId was NOT already part of the criteria for
     * the object, it will not be removed, but will not throw any exceptions.
     * This will not check for the validity of the ResourceId.
     *
     * @param removeAll criteria to be removed
     */
    void removeCriteria(Set<ResourceId> removeAll) {
        criteria.removeAll(removeAll);
    }

    /**
     * Returns the criteria that are in place for a Filter.
     *
     * @return Set of ResourceId criteria
     */
    Set<ResourceId> criteria() {
        return this.criteria;
    }

    /**
     * Method to create a filter that include all entries rejected by the criteria.
     *
     * @param original Filter object with a criteria set
     * @return Filter object with negated criteria set
     * @throws InvalidFilterException if the received Filter object
     * was null or if it had an empty criteria set
     */
    Filter negateFilter(Filter original) {
        throw new FailedException("Not yet implemented");
    }

    /**
     * Returns if the Filter has an empty criteria set.
     *
     * @return {@code true} if criteria set is empty, {@code false} otherwise.
     */
    boolean isEmptyFilter() {
        return criteria.isEmpty();
    }
}