/*
 * Copyright 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.pcep.api;

import org.onosproject.net.Port;

/**
 * Abstraction of a network infrastructure link.
 */
public interface PcepLink extends PcepOperator {

    enum SubType {
        /**
         * Optical Transmission Section Link.
         */
        OTS,

        /**
         * Optical Physical Section Link.
         */
        OPS,

        /**
         * User-to-Network Interface Link.
         */
        UNI,

        /**
         * Optical channel Data Unit-k link.
         */
        ODUk,

        /**
         * Optical Transport Network link.
         */
        OTU,
    }


    enum PortType {
        ODU_PORT, OCH_PORT, OMS_PORT
    }

    /**
     * Returns the link endpoint port type.
     *
     * @return endpoint port type
     */
    PortType portType();

    /**
     * Returns the link sub type,OTS,OPS,PKT_OPTICAL or ODUK.
     *
     * @return link subType
     */

    SubType linkSubType();

    /**
     * Returns the link state, up or down.
     *
     * @return link state
     */
    String linkState();

    /**
     * Returns the distance of a link.
     *
     * @return distance
     */
    int linkDistance();

    /**
     * Returns the capacity type of a link,1: WAVELENGTHNUM, 2:SLOTNUM, 3,
     * BANDWIDTH.
     *
     * @return capacity type
     */
    String linkCapacityType();

    /**
     * Returns the available capacity value ,such as available bandwidth.
     *
     * @return availValue
     */
    int linkAvailValue();

    /**
     * Returns the max capacity value ,such as max bandwidth.
     *
     * @return maxValue
     */
    int linkMaxValue();

    /**
     * Returns the source device did of a link.
     *
     * @return source did
     */
    PcepDpid linkSrcDeviceID();

    /**
     * Returns the destination device did of a link.
     *
     * @return destination did
     */
    PcepDpid linkDstDeviceId();

    /**
     * Returns the source port of a link.
     *
     * @return port number
     */
    Port linkSrcPort();

    /**
     * Returns the destination port of a link.
     *
     * @return port number
     */
    Port linkDstPort();

}
