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

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;

import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Set;

/**
 * Provides constants used in OpenStackSwitching.
 */
public final class Constants {

    private Constants() {
    }

    /**
     * List of valid openstack port types.
     */
    public enum VnicType {
        NORMAL,
        DIRECT,
        UNSUPPORTED
    }
    public static final String PORT_NAME_PREFIX_VM = "tap";
    public static final String PORT_NAME_VHOST_USER_PREFIX_VM = "vhu";

    public static final String OPENSTACK_NETWORKING_APP_ID =
                                            "org.onosproject.openstacknetworking";
    public static final String OPENSTACK_NETWORKING_REST_PATH = "onos/openstacknetworking";
    public static final int REST_PORT = 8181;
    public static final String REST_USER = "onos";
    public static final String REST_PASSWORD = "rocks";
    public static final String REST_UTF8 = StandardCharsets.UTF_8.name();

    public static final String ARP_BROADCAST_MODE = "broadcast";
    public static final String ARP_PROXY_MODE = "proxy";

    public static final String DEFAULT_GATEWAY_MAC_STR = "fe:00:00:00:00:02";
    public static final MacAddress DEFAULT_GATEWAY_MAC =
                                            MacAddress.valueOf(DEFAULT_GATEWAY_MAC_STR);
    public static final MacAddress DEFAULT_EXTERNAL_ROUTER_MAC =
                                            MacAddress.valueOf("fe:00:00:00:00:01");

    public static final String PCI_VENDOR_INFO = "pci_vendor_info";
    public static final String DIRECT = "direct";
    public static final String BAREMETAL = "baremetal";
    public static final String PCISLOT = "pci_slot";

    public static final String ANNOTATION_NETWORK_ID = "networkId";
    public static final String ANNOTATION_PORT_ID = "portId";
    public static final String ANNOTATION_CREATE_TIME = "createTime";
    public static final String ANNOTATION_SEGMENT_ID = "segId";
    public static final String UNSUPPORTED_VENDOR = "unsupported_vendor";

    public static final int PRIORITY_TUNNEL_TAG_RULE = 30000;
    public static final int PRIORITY_FLOATING_EXTERNAL = 41000;
    public static final int PRIORITY_STATEFUL_SNAT_RULE = 40500;
    public static final int PRIORITY_ICMP_RULE = 43000;
    public static final int PRIORITY_ICMP_REQUEST_RULE = 40800;
    public static final int PRIORITY_INTERNAL_ROUTING_RULE = 28000;
    public static final int PRIORITY_EXTERNAL_ROUTING_RULE = 25000;
    public static final int PRIORITY_EXTERNAL_FLOATING_ROUTING_RULE = 27000;
    public static final int PRIORITY_SNAT_RULE = 26000;
    public static final int PRIORITY_SWITCHING_RULE = 30000;
    public static final int PRIORITY_FLAT_JUMP_UPSTREAM_RULE = 41000;
    public static final int PRIORITY_FLAT_UPSTREAM_RULE = 41000;
    public static final int PRIORITY_FLAT_ARP_UPSTREAM_RULE = 41500;
    public static final int PRIORITY_FLAT_DOWNSTREAM_RULE = 42000;
    public static final int PRIORITY_DHCP_RULE = 42000;
    public static final int PRIORITY_ADMIN_RULE = 32000;
    public static final int PRIORITY_ACL_RULE = 31000;
    public static final int PRIORITY_ACL_INGRESS_RULE = 30000;
    public static final int PRIORITY_CT_HOOK_RULE = 30500;
    public static final int PRIORITY_CT_RULE = 32000;
    public static final int PRIORITY_CT_DROP_RULE = 32500;
    public static final int PRIORITY_ARP_GATEWAY_RULE = 41000;
    public static final int PRIORITY_ARP_CONTROL_RULE = 40000;
    public static final int PRIORITY_ARP_REPLY_RULE = 40000;
    public static final int PRIORITY_ARP_REQUEST_RULE = 40000;
    public static final int PRIORITY_ARP_GROUP_RULE = 39000;
    public static final int PRIORITY_FORCED_ACL_RULE = 50000;
    public static final int PRIORITY_ICMP_PROBE_RULE = 50000;

    public static final int PRIORITY_CNI_PT_ARP_RULE = 41500;
    public static final int PRIORITY_CNI_PT_IP_RULE = 41400;
    public static final int PRIORITY_CNI_PT_NODE_PORT_IP_RULE = 42500;
    public static final int PRIORITY_CNI_PT_NODE_PORT_ARP_RULE = 43000;
    public static final int PRIORITY_CNI_PT_NODE_PORT_ARP_EXT_RULE = 41500;

    // flow table index
    public static final int STAT_INBOUND_TABLE = 0;
    public static final int VTAP_INBOUND_TABLE = 1;
    public static final int VTAP_INBOUND_MIRROR_TABLE = 2;
    public static final int STAT_FLAT_OUTBOUND_TABLE = 10;
    public static final int VTAP_FLAT_OUTBOUND_TABLE = 11;
    public static final int VTAP_FLAT_OUTBOUND_MIRROR_TABLE = 12;
    public static final int DHCP_TABLE = 5;
    public static final int FLAT_TABLE = 20;
    public static final int VTAG_TABLE = 30;
    public static final int ARP_TABLE = 35;
    public static final int ACL_EGRESS_TABLE = 40;
    public static final int ACL_INGRESS_TABLE = 44;
    public static final int CT_TABLE = 45;
    public static final int ACL_RECIRC_TABLE = 43;
    public static final int JUMP_TABLE = 50;
    public static final int ROUTING_TABLE = 60;
    public static final int STAT_OUTBOUND_TABLE = 70;
    public static final int VTAP_OUTBOUND_TABLE = 71;
    public static final int VTAP_OUTBOUND_MIRROR_TABLE = 72;
    public static final int FORWARDING_TABLE = 80;
    public static final int GW_COMMON_TABLE = 0;
    public static final int ERROR_TABLE = 100;

    // group table index
    public static final int VTAP_INBOUND_GROUP_TABLE = 1;
    public static final int VTAP_FLAT_OUTBOUND_GROUP_TABLE = 2;
    public static final int VTAP_OUTBOUND_GROUP_TABLE = 3;

    // network type
    public static final String VXLAN = "VXLAN";
    public static final String VLAN = "VLAN";
    public static final String FLAT = "FLAT";
    public static final String GRE = "GRE";
    public static final String GENEVE = "GENEVE";

    public static final Set<String> TUNNEL_TYPE = ImmutableSet.of(VXLAN, GRE, GENEVE);

    public static Map<String, String> portNamePrefixMap() {
        return PORT_NAME_PREFIX_MAP;
    }

    private static final String CAVIUM_PCI_VENDOR_INFO = "177d:9712";
    private static final String PORT_NAME_PREFIX_CAVIUM = "enp";

    private static final Map<String, String> PORT_NAME_PREFIX_MAP = createPortNamePrefixMap();
    private static Map<String, String> createPortNamePrefixMap() {
        //Additional pci vendor information will be added
        return ImmutableMap.of(CAVIUM_PCI_VENDOR_INFO, PORT_NAME_PREFIX_CAVIUM);
    }

    public static final boolean DEFAULT_HA_STATUS = false;
    public static final IpAddress DEFAULT_ACTIVE_IP_ADDRESS = IpAddress.valueOf("127.0.0.1");

    public static final String SECURITY_GROUP_FORMAT = "%-40s%-20s";
    public static final String NETWORK_FORMAT = "%-40s%-20s%-20s%-8s";
    public static final String SUBNET_FORMAT = "%-40s%-20s%-20s";
    public static final String ROUTER_INTF_FORMAT = "%-40s%-20s%-20s";
    public static final String PORT_FORMAT = "%-40s%-20s%-20s%-8s";
    public static final String ROUTER_FORMAT = "%-40s%-20s%-20s%-8s";
    public static final String FLOATING_IP_FORMAT = "%-40s%-20s%-20s";
}
