/*
 * Copyright 2015-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.incubator.net.virtual;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.HostId;
import org.onosproject.net.HostLocation;
import org.onosproject.net.Link;
import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.IntentData;
import org.onosproject.net.intent.IntentState;
import org.onosproject.net.intent.Key;
import org.onosproject.store.Store;

import java.util.Set;

/**
 * Mechanism for distributing and storing virtual network model information.
 */
public interface VirtualNetworkStore
        extends Store<VirtualNetworkEvent, VirtualNetworkStoreDelegate> {

    /**
     * Adds a new tenant ID to the store.
     *
     * @param tenantId tenant identifier
     */
    void addTenantId(TenantId tenantId);

    /**
     * Removes the specified tenant ID from the store.
     *
     * @param tenantId tenant identifier
     */
    void removeTenantId(TenantId tenantId);

    /**
     * Returns set of registered tenant IDs.
     *
     * @return set of tenant identifiers
     */
    Set<TenantId> getTenantIds();

    /**
     * Adds a new virtual network for the specified tenant to the store.
     *
     * @param tenantId tenant identifier
     * @return the virtual network
     */
    VirtualNetwork addNetwork(TenantId tenantId);

    /**
     * Removes the specified virtual network from the store.
     *
     * @param networkId network identifier
     */
    void removeNetwork(NetworkId networkId);

    /**
     * Adds a new virtual device to the store. This device will have no ports.
     *
     * @param networkId network identifier
     * @param deviceId  device identifier
     * @return the virtual device
     */
    VirtualDevice addDevice(NetworkId networkId, DeviceId deviceId);

    /**
     * Removes the specified virtual device from the given network.
     *
     * @param networkId network identifier
     * @param deviceId  device identifier
     */
    void removeDevice(NetworkId networkId, DeviceId deviceId);

    /**
     * Adds a new virtual host to the store.
     *
     * @param networkId network identifier
     * @param hostId    host identifier
     * @param mac       mac address
     * @param vlan      vlan identifier
     * @param location  host location
     * @param ips       set of ip addresses
     * @return the virtual host
     */
    VirtualHost addHost(NetworkId networkId, HostId hostId, MacAddress mac,
                        VlanId vlan, HostLocation location, Set<IpAddress> ips);

    /**
     * Removes the specified virtual host from the store.
     *
     * @param networkId network identifier
     * @param hostId    host identifier
     */
    void removeHost(NetworkId networkId, HostId hostId);

    /**
     * Adds a new virtual link.
     *
     * @param networkId  network identifier
     * @param src        source end-point of the link
     * @param dst        destination end-point of the link
     * @param state      link state
     * @param realizedBy underlying tunnel identifier using which this link is realized
     * @return the virtual link
     */
    VirtualLink addLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst, Link.State state, TunnelId realizedBy);

    /**
     * Updates the tunnelId in the virtual link.
     *
     * @param virtualLink virtual link
     * @param tunnelId    tunnel identifier
     * @param state       link state
     */
    void updateLink(VirtualLink virtualLink, TunnelId tunnelId, Link.State state);

    /**
     * Removes the specified link from the store.
     *
     * @param networkId network identifier
     * @param src       source connection point
     * @param dst       destination connection point
     * @return the virtual link
     */
    VirtualLink removeLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst);

    /**
     * Adds a new virtual port to the network.
     *
     * @param networkId  network identifier
     * @param deviceId   device identifier
     * @param portNumber port number
     * @param realizedBy underlying port which realizes the virtual port
     * @return the virtual port
     */
    VirtualPort addPort(NetworkId networkId, DeviceId deviceId,
                        PortNumber portNumber, Port realizedBy);

    /**
     * Removes the specified port from the given device and network.
     *
     * @param networkId  network identifier
     * @param deviceId   device identifier
     * @param portNumber port number
     */
    void removePort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber);

    /**
     * Returns the list of networks.
     *
     * @param tenantId tenant identifier
     * @return set of virtual networks
     */
    Set<VirtualNetwork> getNetworks(TenantId tenantId);

    /**
     * Returns the virtual network for the given network identifier.
     *
     * @param networkId network identifier
     * @return the virtual network
     */
    VirtualNetwork getNetwork(NetworkId networkId);

    /**
     * Returns the list of devices in the specified virtual network.
     *
     * @param networkId network identifier
     * @return set of virtual devices
     */
    Set<VirtualDevice> getDevices(NetworkId networkId);

    /**
     * Returns the list of hosts in the specified virtual network.
     *
     * @param networkId network identifier
     * @return set of virtual hosts
     */
    Set<VirtualHost> getHosts(NetworkId networkId);

    /**
     * Returns the list of virtual links in the specified virtual network.
     *
     * @param networkId network identifier
     * @return set of virtual links
     */
    Set<VirtualLink> getLinks(NetworkId networkId);

    /**
     * Returns the virtual link matching the network identifier, source connect point,
     * and destination connect point.
     *
     * @param networkId network identifier
     * @param src       source connect point
     * @param dst       destination connect point
     * @return virtual link
     */
    VirtualLink getLink(NetworkId networkId, ConnectPoint src, ConnectPoint dst);

    /**
     * Returns the list of ports of the specified virtual device.
     *
     * @param networkId network identifier
     * @param deviceId  device identifier
     * @return set of virtual networks
     */
    Set<VirtualPort> getPorts(NetworkId networkId, DeviceId deviceId);

    /**
     * Add or update the intent to the store.
     *
     * @param intent virtual intent
     * @param state  intent state
     */
    void addOrUpdateIntent(Intent intent, IntentState state);

    /**
     * Remove the virtual intent from the store.
     *
     * @param intentKey intent key
     * @return intent data
     */
    IntentData removeIntent(Key intentKey);

    /**
     * Adds the intent to tunnel identifier mapping to the store.
     *
     * @param intent   intent
     * @param tunnelId tunnel identifier
     */
    void addTunnelId(Intent intent, TunnelId tunnelId);

    /**
     * Return the set of tunnel identifiers store against the intent.
     *
     * @param intent intent
     * @return set of tunnel identifiers
     */
    Set<TunnelId> getTunnelIds(Intent intent);

    /**
     * Removes the intent to tunnel identifier mapping from the store.
     *
     * @param intent   intent
     * @param tunnelId tunnel identifier
     */
    void removeTunnelId(Intent intent, TunnelId tunnelId);

    /**
     * Return all intents.
     *
     * @return set of intents
     */
    Set<Intent> getIntents();

    /**
     * Return the intent for the specified intent key.
     *
     * @param key intent key
     * @return intent
     */
    Intent getIntent(Key key);

    /**
     * Return the set of intent data.
     *
     * @return set of intent data
     */
    Set<IntentData> getIntentData();

    /**
     * Return the intent data matching the intent key.
     *
     * @param key intent key
     * @return intent data
     */
    IntentData getIntentData(Key key);
}
