/*
 * Copyright 2014-2015 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.segmentrouting.config;

import java.util.List;
import java.util.Map;

import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip4Prefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;

/**
 * Mechanism through which group handler module retrieves
 * the device specific attributes such as segment ID,
 * Mac address...etc from group handler applications.
 */
public interface DeviceProperties {
    /**
     * Checks if the device is configured.
     *
     * @param deviceId device identifier
     * @return true if the device is configured
     */
    boolean isConfigured(DeviceId deviceId);

    /**
     * Returns the segment id of a device to be used in group creation.
     *
     * @param deviceId device identifier
     * @throws DeviceConfigNotFoundException if the device configuration is not found
     * @return segment id of a device
     */
    int getSegmentId(DeviceId deviceId) throws DeviceConfigNotFoundException;

    /**
     * Returns the Mac address of a device to be used in group creation.
     *
     * @param deviceId device identifier
     * @throws DeviceConfigNotFoundException if the device configuration is not found
     * @return mac address of a device
     */
    MacAddress getDeviceMac(DeviceId deviceId) throws DeviceConfigNotFoundException;

    /**
     * Returns the router ip address of a segment router.
     *
     * @param deviceId device identifier
     * @throws DeviceConfigNotFoundException if the device configuration is not found
     * @return router ip address
     */
    Ip4Address getRouterIp(DeviceId deviceId) throws DeviceConfigNotFoundException;

    /**
     * Indicates whether a device is edge device or transit/core device.
     *
     * @param deviceId device identifier
     * @throws DeviceConfigNotFoundException if the device configuration is not found
     * @return boolean
     */
    boolean isEdgeDevice(DeviceId deviceId) throws DeviceConfigNotFoundException;

    /**
     * Returns all segment IDs to be considered in building auto
     *
     * created groups.
     * @return list of segment IDs
     */
    List<Integer> getAllDeviceSegmentIds();

    /**
     * Returns subnet-to-ports mapping of given device.
     *
     * For each entry of the map
     * Key: a subnet
     * Value: a list of ports, which are bound to the subnet
     *
     * @param deviceId device identifier
     * @throws DeviceConfigNotFoundException if the device configuration is not found
     * @return a map that contains all subnet-to-ports mapping of given device
     */
    Map<Ip4Prefix, List<PortNumber>> getSubnetPortsMap(DeviceId deviceId)
            throws DeviceConfigNotFoundException;

    /**
     * Returns the VLAN cross-connect configuration.
     *
     * @return A map of that maps VLAN ID to a list of cross-connect endpoints
     */
    Map<VlanId, List<ConnectPoint>> getXConnects();
}
