/*
 * 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.device;

import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip6Address;
import org.onosproject.iptopology.api.DevicePrefix;
import org.onosproject.iptopology.api.InterfaceIdentifier;
import org.onosproject.iptopology.api.IpDevice;
import org.onosproject.iptopology.api.DeviceIntf;
import org.onosproject.net.DeviceId;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.store.Store;

import java.util.List;

/**
 * Manages inventory of ip devices; not intended for direct use.
 */
public interface IpDeviceStore extends Store<IpDeviceEvent, IpDeviceStoreDelegate> {

    /**
     * Returns the number of ip devices known to the system.
     *
     * @return number of ip devices
     */
    int getIpDeviceCount();

    /**
     * Returns an iterable collection of all ip devices known to the system.
     *
     * @return ip device collection
     */
    Iterable<IpDevice> getIpDevices();


    /**
     * Returns an ip device with the specified identifier.
     *
     * @param deviceId device identifier
     * @return ip device
     */
    IpDevice getIpDevice(DeviceId deviceId);

    /**
     * Creates a new infrastructure ip device, or updates an existing one using
     * the supplied device description.
     *
     * @param providerId        provider identifier
     * @param deviceId          device identifier
     * @param deviceDescription device description
     * @return ready to send event describing what occurred; null if no change
     */
    IpDeviceEvent createOrUpdateIpDevice(ProviderId providerId, DeviceId deviceId,
                                     IpDeviceDescription deviceDescription);

    /**
     * Administratively removes the specified ip device from the store.
     *
     * @param deviceId device to be removed
     * @return null if no such ip device
     */
    IpDeviceEvent removeIpDevice(DeviceId deviceId);

    /**
     * Updates the interface of the specified ip device using the given
     * list of interface descriptions. The list is assumed to be comprehensive.
     *
     * @param providerId            provider identifier
     * @param deviceId              ip device identifier
     * @param interfaceDescriptions list of interface descriptions
     * @return ready to send events describing what occurred; empty list if no change
     */
    List<IpDeviceEvent> updateInterfaces(ProviderId providerId, DeviceId deviceId,
                                  List<InterfaceDescription> interfaceDescriptions);

    /**
     * Administratively removes the specified interface from the store.
     *
     * @param deviceId device of the interfaces to be removed
     * @param interfaceDescriptions list of interface descriptions
     * @return ready to send events describing what occurred.
     */
    List<IpDeviceEvent> removeInterfaces(DeviceId deviceId, List<InterfaceDescription> interfaceDescriptions);

    /**
     * Returns the list of interfaces that belong to the specified device.
     *
     * @param deviceId device identifier
     * @return list of device interfaces
     */
    List<DeviceIntf> getInterfaces(DeviceId deviceId);

    /**
     * Returns the specified device interface.
     *
     * @param deviceId    device identifier
     * @param ipv4Address ipv4 address of the interface
     * @return device interface
     */
    DeviceIntf getInterface(DeviceId deviceId, Ip4Address ipv4Address);

    /**
     * Returns the specified device interface.
     *
     * @param deviceId    device identifier
     * @param ipv6Address ipv6 address of the interface
     * @return device interface
     */
    DeviceIntf getInterface(DeviceId deviceId, Ip6Address ipv6Address);

    /**
     * Returns the specified device interface.
     *
     * @param deviceId    device identifier
     * @param intfId      interface identifier of the interface
     * @return device interface
     */
    DeviceIntf getInterface(DeviceId deviceId, InterfaceIdentifier intfId);

    /**
     * Updates the prefix information of the specified ip device using the given
     * list of prefix descriptions. The list is assumed to be comprehensive.
     *
     * @param providerId           provider identifier
     * @param deviceId             ip device identifier
     * @param prefixDescriptions   list of prefix descriptions
     * @return ready to send events describing what occurred; empty list if no change
     */
    List<IpDeviceEvent>  updatePrefixes(ProviderId providerId, DeviceId deviceId,
                                        List<PrefixDescription> prefixDescriptions);

    /**
     * Administratively removes the specified prefix from the store.
     *
     * @param deviceId device of the prefix to be removed
     * @param prefixDescriptions list of prefix descriptions
     * @return ready to send events describing what occurred.
     */
    List<IpDeviceEvent> removePrefixes(DeviceId deviceId, List<PrefixDescription> prefixDescriptions);

    /**
     * Returns the list of prefixes that belong to the specified device.
     *
     * @param deviceId device identifier
     * @return list of device prefixes
     */
    List<DevicePrefix> getPrefixes(DeviceId deviceId);

}

