/*
 * 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.onosproject.store.resource.impl;

import org.onosproject.net.resource.DiscreteResource;
import org.onosproject.net.resource.DiscreteResourceId;

import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * A common API for a set of discrete resources.
 */
interface DiscreteResources {
    /**
     * Returns an instance representing an empty set.
     *
     * @return a empty set.
     */
    static DiscreteResources empty() {
        return NonEncodableDiscreteResources.empty();
    }

    /**
     * Look up a discrete resource instance by ID.
     *
     * @param id id
     * @return found instance enclosed by Optional
     */
    Optional<DiscreteResource> lookup(DiscreteResourceId id);

    /**
     * Returns a difference set of this instance and the given instance.
     *
     * @param other other instance
     * @return a new DiscreteResources instance representing a difference set
     */
    DiscreteResources difference(DiscreteResources other);

    /**
     * Checks that this instance is empty.
     *
     * @return true if this instance is empty, otherwise false.
     */
    boolean isEmpty();

    /**
     * Checks that this instance contains any of the given resources.
     *
     * @param other resources
     * @return true this instance contains a resource included in the given resources,
     * otherwise false.
     */
    boolean containsAny(List<DiscreteResource> other);

    /**
     * Returns a union set of this instance and the given instance.
     * Note: This method returns a new instance, not mutate the current instance
     *
     * @param other other instance
     * @return a new DiscreteResources instance representing a union set
     */
    DiscreteResources add(DiscreteResources other);

    /**
     * Returns a difference set of this instance and the given resources.
     * Note: This method returns a new instance, not mutate the current intance.
     *
     * @param removed resources
     * @return a new DiscreteResources instance representing a difference set
     */
    DiscreteResources remove(List<DiscreteResource> removed);

    /**
     * Returns all of resources this instance holds.
     *
     * @return all resources
     */
    Set<DiscreteResource> values();
}
