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

import org.onosproject.net.driver.Projectable;

/**
 * Abstraction of a network infrastructure link.
 */
public interface Link extends Annotated, Provided, Projectable, NetworkResource {

    /**
     * Coarse representation of the link type.
     */
    enum Type {
        /**
         * Signifies that this is a direct single-segment link.
         */
        DIRECT,

        /**
         * Signifies that this link is potentially comprised from multiple
         * underlying segments or hops, and as such should be used to tag
         * links traversing optical paths, tunnels or intervening 'dark'
         * switches.
         */
        INDIRECT,

        /**
         * Signifies that this link is an edge, i.e. host link.
         */
        EDGE,

        /**
         * Signifies that this link represents a logical link backed by
         * some form of a tunnel, e.g., GRE, MPLS, ODUk, OCH.
         */
        TUNNEL,

        /**
         * Signifies that this link is realized by fiber (either single channel or WDM).
         */
        OPTICAL,

        /**
         * Signifies that this link is a virtual link or a pseudo-wire.
         */
        VIRTUAL
    }

    /**
     * Representation of the link state, which applies primarily only to
     * configured durable links, i.e. those that need to remain present,
     * but instead be marked as inactive.
     */
    enum State {
        /**
         * Signifies that a link is currently active.
         */
        ACTIVE,

        /**
         * Signifies that a link is currently active.
         */
        INACTIVE
    }

    /**
     * Returns the link source connection point.
     *
     * @return link source connection point
     */
    ConnectPoint src();

    /**
     * Returns the link destination connection point.
     *
     * @return link destination connection point
     */
    ConnectPoint dst();

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

    /**
     * Returns the link state.
     *
     * @return link state
     */
    State state();

    /**
     * Indicates if the link is to be considered durable.
     *
     * @return true if the link is durable
     * @deprecated in Falcon Release - replaced by isConfigured()
     */
    @Deprecated
    boolean isDurable();

    /**
     * Indicates if the link was created from a predefined configuration.
     *
     * @return true if the link was created from a predefined configuration,
     *              false otherwise.
     */
    boolean isExpected();
}
