/*
 * Copyright 2015-2016 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.openstackswitching;

import org.onosproject.net.Port;
import org.onosproject.openstackrouting.OpenstackRouter;
import org.onosproject.openstackrouting.OpenstackRouterInterface;

import java.util.Collection;

/**
 * Handles port management REST API from Openstack for VMs.
 */
public interface OpenstackSwitchingService {

    /**
     * Store the port information created by Openstack.
     *
     * @param openstackPort port information
     */
    void createPorts(OpenstackPort openstackPort);

    /**
     * Removes flow rules corresponding to the port removed by Openstack.
     *
     * @param uuid UUID
     */
    void deletePort(String uuid);

    /**
     * Updates flow rules corresponding to the port information updated by Openstack.
     *
     * @param openstackPort OpenStack port
     */
    void updatePort(OpenstackPort openstackPort);

    /**
     * Stores the network information created by openstack.
     *
     * @param openstackNetwork network information
     */
    void createNetwork(OpenstackNetwork openstackNetwork);

    /**
     * Stores the subnet information created by openstack.
     *
     * @param openstackSubnet subnet information
     */
    void createSubnet(OpenstackSubnet openstackSubnet);

    /**
     * Returns port information list for the network ID given.
     *
     * @param networkId Network ID of the ports
     * @return port information list
     */
    Collection<OpenstackPort> ports(String networkId);

    /**
     * Returns port information list.
     *
     * @return port information list
     */
    Collection<OpenstackPort> ports();
    /**
     * Returns port information for the port given.
     *
     * @param port port reference
     * @return port information
     */
    OpenstackPort port(Port port);

    /**
     * Returns port information for the port ID given.
     *
     * @param portId Port ID
     * @return port information
     */
    OpenstackPort port(String portId);

    /**
     * Returns network information list for the network ID given.
     *
     * @param networkId Network ID
     * @return network information list, or null if not present
     */
    OpenstackNetwork network(String networkId);


    /**
     * Returns subnet information for the subnet ID give.
     *
     * @param subnetId Subnet ID
     * @return subnet information, or null if not present
     */
    OpenstackSubnet subnet(String subnetId);

    /**
     * Sends the created router information to OpenstackRouting service.
     *
     * @param openstackRouter Router Information
     */
    void createRouter(OpenstackRouter openstackRouter);
    /**
     * Sends the updated router information to OpenstackRouting service.
     *
     * @param routerId Router ID
     */
    void updateRouter(String  routerId);
    /**
     * Sends the removed router information to OpenstackRouting service.
     *
     * @param routerId Router ID
     */
    void deleteRouter(String routerId);

    /**
     * Sends the updated router interface information to OpenstackRouting service.
     *
     * @param openstackRouterInterface Router interface information
     */
    void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);

    /**
     * Sends the removed router interface information to OpenstackRouting service.
     *
     * @param openstackRouterInterface Router interface information
     */
    void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);

    /**
     * Returns the router information list.
     *
     * @return router information list
     */
    Collection<OpenstackRouter> routers();

    /**
     * Returns the router information for the router ID given.
     *
     * @param routerId router ID
     * @return router information
     */
    OpenstackRouter router(String routerId);

    /**
     * Returns the OpensatckPortInfo list.
     *
     * @return OpensatckPortInfo list
     */
    Collection<OpenstackPortInfo> portInfos();

    /**
     * Returns the MacAddress for physical router.
     *
     * @return physical router mac
     */
    String physicalRouterMac();


}
