/*
 * 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.iptopology.api.link;

import org.onosproject.iptopology.api.IpLink;
import org.onosproject.iptopology.api.TerminationPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.store.Store;

import java.util.Set;

/**
 * Manages inventory of ip links; not intended for direct use.
 */
public interface IpLinkStore extends Store<IpLinkEvent, IpLinkStoreDelegate> {

    /**
     * Returns the number of ip links in the store.
     *
     * @return number of ip links
     */
    int getIpLinkCount();

    /**
     * Returns an iterable collection of all ip links in the inventory.
     *
     * @return collection of all ip links
     */
    Iterable<IpLink> getIpLinks();

    /**
     * Returns all ip links egressing from the specified device.
     *
     * @param deviceId device identifier
     * @return set of ip device links
     */
    Set<IpLink> getIpDeviceEgressLinks(DeviceId deviceId);

    /**
     * Returns all ip links ingressing from the specified device.
     *
     * @param deviceId device identifier
     * @return set of ip device links
     */
    Set<IpLink> getIpDeviceIngressLinks(DeviceId deviceId);

    /**
     * Returns the ip link between the two termination points.
     *
     * @param src source termination point
     * @param dst destination termination point
     * @return ip link or null if one not found between the termination points
     */
    IpLink getIpLink(TerminationPoint src, TerminationPoint dst);

    /**
     * Returns all ip links egressing from the specified termination point.
     *
     * @param src source termination point
     * @return set of termination point ip links
     */
    Set<IpLink> getEgressIpLinks(TerminationPoint src);

    /**
     * Returns all ip links ingressing to the specified termination point.
     *
     * @param dst destination termination point
     * @return set of termination point ip links
     */
    Set<IpLink> getIngressIpLinks(TerminationPoint dst);

    /**
     * Creates a new ip link, or updates an existing one, based on the given
     * information.
     *
     * @param providerId      provider identity
     * @param linkDescription ip link description
     * @return create or update ip link event, or null if no change resulted
     */
    IpLinkEvent createOrUpdateIpLink(ProviderId providerId,
                                        IpLinkDescription linkDescription);

    /**
     * Removes ip link, based on the specified information.
     *
     * @param src ip link source
     * @param dst ip link destination
     * @return remove or update ip link event, or null if no change resulted
     */
    IpLinkEvent removeOrDownIpLink(TerminationPoint src, TerminationPoint dst);

    /**
     * Removes ip link based on the specified information.
     *
     * @param src ip link source
     * @param dst ip link destination
     * @return remove ip link event, or null if no change resulted
     */
    IpLinkEvent removeIpLink(TerminationPoint src, TerminationPoint dst);

}
