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

import java.util.HashMap;
import java.util.Map;

/**
 * Abstraction of Router ID to identify the router with a distinct IP address.
 */
public interface RouteIdentifier {
    /**
     * Enum to provide Protocol type.
     */
    public enum ProtocolType {
        ISIS_LevelOne(1), ISIS_LevelTwo(2), OSPFv2(3), Direct(4), Static_Configuration(5), OSPFv3(6);
        int value;

        /**
         * Sets protocol ID.
         *
         * @param val protocol ID
         */
        ProtocolType(int val) {
            value = val;
        }

        static Map<Integer, ProtocolType> map = new HashMap<>();

        static {
           for (ProtocolType type : ProtocolType.values()) {
              map.put(type.value, type);
           }
        }

        /**
         * A method that returns enum value.
         *
         * @param value protocol type
         * @return Enum value
         */
        public static ProtocolType getEnumType(int value) {
            return map.get(value);
         }

        /**
         * Provides Protocol ID.
         *
         * @return Protocol ID
         */
        public byte getType() {
            return (byte) value;
        }
    }

    /**
     * Provides Protocol ID to identify which protocol routing instance is used.
     *
     * @return Protocol type
     */
    ProtocolType type();
}