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

/**
 * Collection of keys for annotation.
 * <p>
 * Number of the annotation keys have been deprecated as the use of annotations
 * is being phased out and instead network configuration subsystem is being
 * phased-in for majority of model meta-data.
 */
public final class AnnotationKeys {

    private static final double DEFAULT_VALUE = 1.0;

    // Prohibit instantiation
    private AnnotationKeys() {
    }

    /**
     * Annotation key for instance name.
     */
    public static final String NAME = "name";

    /**
     * Annotation key for instance type (e.g. host type).
     *
     * @deprecated since Cardinal
     */
    @Deprecated
    public static final String TYPE = "type";

    /**
     * Annotation key for UI type (the glyph ID for rendering).
     */
    public static final String UI_TYPE = "uiType";

    /**
     * Annotation key for UI location type of device/host
     * (either 'geo' or 'grid').
     */
    public static final String LOC_TYPE = "locType";

    /**
     * Annotation key for latitude (e.g. latitude of device/host
     * in a geo-layout).
     */
    public static final String LATITUDE = "latitude";

    /**
     * Annotation key for longitude (e.g. longitude of device/host
     * in a geo-layout).
     */
    public static final String LONGITUDE = "longitude";

    /**
     * Annotation key for grid-Y (e.g. y-coordinate of device/host
     * in a grid-layout).
     */
    public static final String GRID_Y = "gridY";

    /**
     * Annotation key for grid-X (e.g. x-coordinate of device/host
     * in a grid-layout).
     */
    public static final String GRID_X = "gridX";

    /**
     * Annotation key for southbound protocol.
     */
    public static final String PROTOCOL = "protocol";

    /**
     * Annotation key for the device driver name.
     */
    public static final String DRIVER = "driver";

    /**
     * Annotation key for durable links.
     */
    public static final String DURABLE = "durable";

    /**
     * Annotation key for link metric; used by
     * {@link org.onosproject.net.topology.MetricLinkWeight} function.
     */
    public static final String METRIC = "metric";

    /**
     * Annotation key for latency.
     */
    public static final String LATENCY = "latency";

    /**
     * Annotation key for bandwidth.
     * The value for this key is interpreted as Mbps.
     */
    public static final String BANDWIDTH = "bandwidth";

    /**
     * Annotation key for the number of optical waves.
     */
    public static final String OPTICAL_WAVES = "optical.waves";

    /**
     * Annotation key for the port name.
     */
    public static final String PORT_NAME = "portName";

    /**
     * Annotation key for the port mac.
     */
    public static final String PORT_MAC = "portMac";

    /**
     * Annotation key for the router ID.
     */
    public static final String ROUTER_ID = "routerId";

    /**
     * Annotation key for the static lambda.
     */
    public static final String STATIC_LAMBDA = "staticLambda";

    /**
     * Annotation key for the static port.
     */
    public static final String STATIC_PORT = "staticPort";

    /**
     * Annotation key for device location.
     */
    public static final String RACK_ADDRESS = "rackAddress";

    /**
     * Annotation key for device owner.
     */
    public static final String OWNER = "owner";

    /**
     * Annotation key for the channel id.
     */
    public static final String CHANNEL_ID = "channelId";

    /**
     * Annotation key for the management address.
     */
    public static final String MANAGEMENT_ADDRESS = "managementAddress";

    /**
     * Annotation key for the username.
     */
    public static final String USERNAME = "username";

    /**
     * Annotation key for the password.
     */
    public static final String PASSWORD = "password";

    /**
     * Link annotation key to express that a Link
     * is backed by underlying protection mechanism.
     */
    // value is undefined at the moment, only using key existence
    public static final String PROTECTED = "protected";

    /**
     * Annotation key for REST server identifier.
     */
    public static final String REST_SERVER = "restServer";

    /**
     * Annotation key for the sshkey.
     */
    public static final String SSHKEY = "sshkey";

    /**
     * Returns the value annotated object for the specified annotation key.
     * The annotated value is expected to be String that can be parsed as double.
     * If parsing fails, the returned value will be {@value DEFAULT_VALUE}.
     *
     * @param annotated annotated object whose annotated value is obtained
     * @param key       key of annotation
     * @return double value of annotated object for the specified key
     */
    public static double getAnnotatedValue(Annotated annotated, String key) {
        double value;
        try {
            value = Double.parseDouble(annotated.annotations().value(key));
        } catch (NumberFormatException e) {
            value = DEFAULT_VALUE;
        }
        return value;
    }
}
