/*
 * Copyright 2014-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.net;


/**
 * Abstraction of a network port.
 */
public interface Port extends Annotated {

    /** Represents coarse port type classification. */
    enum Type {
        /**
         * Signifies copper-based connectivity.
         */
        COPPER,

        /**
         * Signifies optical fiber-based connectivity.
         */
        FIBER,

        /**
         * Signifies optical fiber-based packet port.
         */
        PACKET,

        /**
         * Signifies optical fiber-based optical tributary port (called T-port).
         * The signal from the client side will be formed into a ITU G.709 (OTN) frame.
         */
        ODUCLT,

        /**
         * Signifies optical fiber-based Line-side port (called L-port).
         */
        OCH,

        /**
         * Signifies optical fiber-based WDM port (called W-port).
         * Optical Multiplexing Section (See ITU G.709).
         */
        OMS,

        /**
         * Signifies virtual port.
         */
        VIRTUAL,

        /**
         * Signifies optical fiber-based OTN port.
         */
        OTU
    }

    /**
     * Returns the parent network element to which this port belongs.
     *
     * @return parent network element
     */
    Element element();

    /**
     * Returns the port number.
     *
     * @return port number
     */
    PortNumber number();

    /**
     * Indicates whether or not the port is currently up and active.
     *
     * @return true if the port is operational
     */
    boolean isEnabled();

    /**
     * Returns the port type.
     *
     * @return port type
     */
    Type type();

    /**
     * Returns the current port speed in Mbps.
     *
     * @return current port speed
     */
    long portSpeed();

    // TODO: more attributes?
}
