/*
 * 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.net.flow.criteria;

import com.google.common.annotations.Beta;
import com.google.common.base.MoreObjects;

import java.util.Objects;

/**
 * Type of selector extensions.
 */
@Beta
public class ExtensionSelectorType {

    /**
     * A list of well-known named extension selector type codes.
     * These numbers have no impact on the actual OF type id.
     */
    public enum ExtensionSelectorTypes {
        NICIRA_MATCH_NSH_SPI(0),
        NICIRA_MATCH_NSH_SI(1),
        NICIRA_MATCH_NSH_CH1(2),
        NICIRA_MATCH_NSH_CH2(3),
        NICIRA_MATCH_NSH_CH3(4),
        NICIRA_MATCH_NSH_CH4(5),
        OFDPA_MATCH_VLAN_VID(16);

        private ExtensionSelectorType type;

        /**
         * Creates a new named extension selector type.
         *
         * @param type type code
         */
        ExtensionSelectorTypes(int type) {
            this.type = new ExtensionSelectorType(type);
        }

        /**
         * Gets the extension type object for this named type code.
         *
         * @return extension type object
         */
        public ExtensionSelectorType type() {
            return type;
        }
    }

    private final int type;

    /**
     * Creates an extension type with the given int type code.
     *
     * @param type type code
     */
    public ExtensionSelectorType(int type) {
        this.type = type;
    }

    @Override
    public int hashCode() {
        return Objects.hash(type);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof ExtensionSelectorType) {
            final ExtensionSelectorType that = (ExtensionSelectorType) obj;
            return this.type == that.type;
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(ExtensionSelectorType.class)
                .add("type", type)
                .toString();
    }
}
