/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.tetunnel.api.tunnel;

import org.onosproject.tetopology.management.api.node.TeNodeKey;
import org.onosproject.tetopology.management.api.node.TtpKey;
import org.onosproject.tetunnel.api.tunnel.path.TePath;

import java.util.List;

/**
 * Representation of a TE tunnel attributes.
 */
public interface TeTunnel {

    /**
     * TE tunnel types.
     */
    enum Type {
        /**
         * Designates TE point-to-point tunnel.
         */
        P2P,
        /**
         * Designates TE point-to-multipoint tunnel.
         */
        P2MP,
        /**
         * Designates RSVP-TE path signaling tunnel.
         */
        PATH_SIGNALING_RSVPTE,
        /**
         * Designates Segment-routing path signaling tunnel.
         */
        PATH_SIGNALING_SR
    }

    /**
     * LSP protection types.
     */
    enum LspProtectionType {
        /**
         * Designates LSP protection "Unprotected".
         */
        LSP_PROT_UNPROTECTED,
        /**
         * Designates LSP protection "Rerouting without Extra-Traffic".
         */
        LSP_PROT_REROUTE,
        /**
         * Designates LSP protection "(Full) Rerouting".
         */
        LSP_PROT_REROUTE_EXTRA,
        /**
         * Designates LSP protection "1+1 Unidirectional Protection".
         */
        LSP_PROT_UNIDIR_1_TO_1,
        /**
         * Designates LSP protection "1+1 Bidirectional Protection".
         */
        LSP_PROT_BIDIR_1_TO_1,
        /**
         * Designates LSP protection "1:N Protection with Extra-Traffic".
         */
        LSP_PROT_1_FOR_N
    }

    /**
     * TE Tunnel state.
     */
    enum State {
        /**
         * Designates the tunnel is down (non-operational).
         */
        DOWN,
        /**
         * Designates the tunnel is up.
         */
        UP
    }

    /**
     * Returns the TE tunnel key.
     *
     * @return TE tunnel key
     */
    TeTunnelKey teTunnelKey();

    /**
     * Returns the name of the TE tunnel.
     *
     * @return name of the TE tunnel
     */
    String name();

    /**
     * Returns the type of the TE tunnel.
     *
     * @return type of the TE tunnel
     */
    Type type();

    /**
     * Returns the key of source TE node of this TE tunnel.
     *
     * @return key of the source TE node
     */
    TeNodeKey srcNode();

    /**
     * Returns key of the source TE termination point of this tunnel.
     *
     * @return key of the source TE termination point
     */
    TtpKey srcTp();

    /**
     * Returns key of the destination TE node of this TE tunnel.
     *
     * @return key of the destination TE node
     */
    TeNodeKey dstNode();

    /**
     * Returns key of the destination TE termination point of this TE tunnel.
     *
     * @return key of the destination TE termination point
     */
    TtpKey dstTp();

    /**
     * Returns the TE LSP protection type of the TE tunnel.
     *
     * @return TE LSP protection type of the TE tunnel
     */
    LspProtectionType lspProtectionType();

    /**
     * Returns the TE tunnel administrative state.
     *
     * @return TE tunnel administrative state
     */
    State adminStatus();

    /**
     * Returns primary paths of this TE tunnel.
     *
     * @return a list of TE paths
     */
    List<TePath> primaryPaths();

    /**
     * Returns segment tunnels of this (E2E cross-domain) tunnel.
     *
     * @return a list of keys of the segment tunnels
     */
    List<TeTunnelKey> segmentTunnels();

    /**
     * Sets segment tunnels of this (E2E cross-domain) tunnel.
     *
     * @param segmentTunnels a list of keys of segment tunnels
     */
    void segmentTunnels(List<TeTunnelKey> segmentTunnels);

    /**
     * Returns key of the E2E tunnel of this (segment) tunnel.
     *
     * @return key of the corresponding E2E TE tunnel
     */
    TeTunnelKey e2eTunnelKey();

    /**
     * Sets the E2E tunnel of this (segment) tunnel.
     *
     * @param e2eTunnelKey key of the corresponding E2E tunnel
     */
    void e2eTunnelKey(TeTunnelKey e2eTunnelKey);

    //TODO: add more required TE attributes
}
