/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.onlab.util;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.base.Preconditions.checkArgument;

/**
 * Filters content on a given object with String representation.
 * This is carried out through restrictive (AND) or loose (OR) searches.
 * If not provided, strategy defaults to ADD.
 */
public class StringFilter {

    /**
     * Defines the filtering strategy.
     */
    public enum Strategy {
        AND,
        OR
    }

    private Strategy strategy = Strategy.AND;
    private List<String> filter = new ArrayList<>();

    /**
     * Creates a new filter to apply on some data.
     *
     * @param filter list with filters to apply
     */
    public StringFilter(List<String> filter) {
        this.filter = filter;
    }

    /**
     * Creates a new filter to apply on some data,
     * given a specific strategy (AND, OR).
     *
     * @param filter   list with filters to apply
     * @param strategy type of strategy (AND, OR)
     */
    public StringFilter(List<String> filter, Strategy strategy) {
        this(filter);
        checkArgument(strategy == Strategy.AND || strategy == Strategy.OR,
                      "Chosen strategy is not allowed (should be one of {AND, OR})");
        this.strategy = strategy;
    }

    /**
     * Filters data according to a set of restrictions and the AND strategy.
     *
     * @param data Object with data to filter
     * @return true if data honours the filter, false otherwise
     */
    private boolean filterAnd(Object data) {
        return filter.isEmpty() ||
                filter.stream().filter(data.toString()::contains)
                        .count() == filter.size();
    }

    /**
     * Filters data according to a set of restrictions and the OR strategy.
     *
     * @param data Object with data to filter
     * @return true if data honours the filter, false otherwise
     */
    private boolean filterOr(Object data) {
        return filter.isEmpty() ||
                filter.stream().filter(data.toString()::contains)
                        .count() > 0;
    }

    /**
     * Filters data according to a set of restrictions and a specific strategy.
     *
     * @param data Object with data to filter
     * @return true if data honours the filters, false otherwise
     */
    public boolean filter(Object data) {
        if (strategy == Strategy.OR) {
            return filterOr(data);
        } else {
            return filterAnd(data);
        }
    }
}
