/*
 * 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.ui.topo;

/**
 * Defines string constants used in the Topology View of the ONOS GUI.
 * <p>
 * See also:
 * <ul>
 *     <li> https://wiki.onosproject.org/display/ONOS/UI+Service+-+GlyphService </li>
 * </ul>
 */
public final class TopoConstants {

    /**
     * Defines constants for standard glyph identifiers.
     */
    public static final class Glyphs {
        public static final String UNKNOWN = "unknown";
        public static final String BIRD = "bird";
        public static final String NODE = "node";
        public static final String SWITCH = "switch";
        public static final String ROADM = "roadm";
        public static final String ENDSTATION = "endstation";
        public static final String ROUTER = "router";
        public static final String BGP_SPEAKER = "bgpSpeaker";
        public static final String CHAIN = "chain";
        public static final String CROWN = "crown";
        public static final String TOPO = "topo";
        public static final String REFRESH = "refresh";
        public static final String GARBAGE = "garbage";
        public static final String FLOW_TABLE = "flowTable";
        public static final String PORT_TABLE = "portTable";
        public static final String GROUP_TABLE = "groupTable";
        public static final String SUMMARY = "summary";
        public static final String DETAILS = "details";
        public static final String PORTS = "ports";
        public static final String MAP = "map";
        public static final String CYCLE_LABELS = "cycleLabels";
        public static final String OBLIQUE = "oblique";
        public static final String FILTERS = "filters";
        public static final String RESET_ZOOM = "resetZoom";
        public static final String RELATED_INTENTS = "relatedIntents";
        public static final String NEXT_INTENT = "nextIntent";
        public static final String PREV_INTENT = "prevIntent";
        public static final String INTENT_TRAFFIC = "intentTraffic";
        public static final String ALL_TRAFFIC = "allTraffic";
        public static final String FLOWS = "flows";
        public static final String EQ_MASTER = "eqMaster";
        public static final String UI_ATTACHED = "uiAttached";
        public static final String CHECK_MARK = "checkMark";
        public static final String X_MARK = "xMark";
        public static final String TRIANGLE_UP = "triangleUp";
        public static final String TRIANGLE_DOWN = "triangleDown";
        public static final String PLUS = "plus";
        public static final String MINUS = "minus";
        public static final String PLAY = "play";
        public static final String STOP = "stop";
        public static final String CLOUD = "cloud";
    }

    /**
     * Defines constants for property names on the default summary and
     * details panels.
     */
    public static final class Properties {
        public static final String SEPARATOR = "-";

        // summary panel
        public static final String DEVICES = "Devices";
        public static final String LINKS = "Links";
        public static final String HOSTS = "Hosts";
        public static final String TOPOLOGY_SSCS = "Topology SCCs";
        public static final String INTENTS = "Intents";
        public static final String TUNNELS = "Tunnels";
        public static final String FLOWS = "Flows";
        public static final String VERSION = "Version";

        // device details
        public static final String URI = "URI";
        public static final String VENDOR = "Vendor";
        public static final String HW_VERSION = "H/W Version";
        public static final String SW_VERSION = "S/W Version";
        public static final String SERIAL_NUMBER = "Serial Number";
        public static final String PROTOCOL = "Protocol";
        public static final String LATITUDE = "Latitude";
        public static final String LONGITUDE = "Longitude";
        public static final String PORTS = "Ports";

        // host details
        public static final String MAC = "MAC";
        public static final String IP = "IP";
        public static final String VLAN = "VLAN";
    }

    private static final class CoreButton extends ButtonDescriptor {
        private CoreButton(String tag, String glyphId, boolean extra) {
            super("show" + tag + "View",
                  glyphId,
                  "Show " + tag + " View" + (extra ? " for this Device" : ""));
        }
    }

    /**
     * Defines constants for core buttons that appear on the topology
     * details panel.
     */
    public static final class CoreButtons {
        public static final ButtonDescriptor SHOW_DEVICE_VIEW =
                new CoreButton("Device", Glyphs.SWITCH, false);

        public static final ButtonDescriptor SHOW_FLOW_VIEW =
                new CoreButton("Flow", Glyphs.FLOW_TABLE, true);

        public static final ButtonDescriptor SHOW_PORT_VIEW =
                new CoreButton("Port", Glyphs.PORT_TABLE, true);

        public static final ButtonDescriptor SHOW_GROUP_VIEW =
                new CoreButton("Group", Glyphs.GROUP_TABLE, true);
    }

}
