/*
 * Copyright 2015-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.vtnrsc.routerinterface;

import java.util.Collection;

import org.onosproject.vtnrsc.RouterInterface;
import org.onosproject.vtnrsc.SubnetId;

/**
 * Service for interacting with the inventory of Router interface.
 */
public interface RouterInterfaceService {
    /**
     * Returns exists or not of specific subnet identifier.
     *
     * @param subnetId subnet identifier
     * @return true or false
     */
    boolean exists(SubnetId subnetId);

    /**
     * Returns a collection of the currently known Router interface.
     *
     * @return collection of RouterInterface
     */
    Collection<RouterInterface> getRouterInterfaces();

    /**
     * Returns the Router interface with the specified subnet identifier.
     *
     * @param subnetId subnet identifier
     * @return RouterInterface or null if one with the given identifier is not
     *         known
     */
    RouterInterface getRouterInterface(SubnetId subnetId);

    /**
     * Adds the specified RouterInterface.
     *
     * @param routerInterface the interface add to router
     * @return true if add router interface successfully
     */
    boolean addRouterInterface(RouterInterface routerInterface);

    /**
     * Removes the specified RouterInterface.
     *
     * @param routerInterface the interface remove from router
     * @return true if remove router interface successfully
     */
    boolean removeRouterInterface(RouterInterface routerInterface);

    /**
     * Adds the specified listener to Router Interface manager.
     *
     * @param listener Router Interface listener
     */
    void addListener(RouterInterfaceListener listener);

    /**
     * Removes the specified listener to RouterInterface manager.
     *
     * @param listener Router Interface listener
     */
    void removeListener(RouterInterfaceListener listener);
}
