package net.onrc.onos.core.util;

import org.codehaus.jackson.annotate.JsonProperty;

/**
 * The class representing a network port of a switch.
 */

public class Port {
    /**
     * Special port values.
     * <p/>
     * Those values are taken as-is from the OpenFlow-v1.0.0 specification
     * (pp 18-19).
     */
    public enum PortValues {
        /* Maximum number of physical switch ports. */
        PORT_MAX((short) 0xff00),

    /* Fake output "ports". */

        /* Send the packet out the input port. This
           virtual port must be explicitly used
           in order to send back out of the input
           port. */
        PORT_IN_PORT((short) 0xfff8),

        /* Perform actions in flow table.
           NB: This can only be the destination
           port for packet-out messages. */
        PORT_TABLE((short) 0xfff9),

        /* Process with normal L2/L3 switching. */
        PORT_NORMAL((short) 0xfffa),

        /* All physical ports except input port and
           those disabled by STP. */
        PORT_FLOOD((short) 0xfffb),

        /* All physical ports except input port. */
        PORT_ALL((short) 0xfffc),

        /* Send to controller. */
        PORT_CONTROLLER((short) 0xfffd),

        /* Local openflow "port". */
        PORT_LOCAL((short) 0xfffe),

        /* Not associated with a physical port. */
        PORT_NONE((short) 0xffff);

        private final short value;    // The value

        /**
         * Constructor for a given value.
         *
         * @param value the value to use for the initialization.
         */
        private PortValues(short value) {
            this.value = value;
        }

        /**
         * Get the value as a short integer.
         *
         * @return the value as a short integer.
         */
        private short value() {
            return this.value;
        }
    }

    private short value;

    /**
     * Default constructor.
     */
    public Port() {
        this.value = 0;
    }

    /**
     * Copy constructor.
     *
     * @param other the object to copy from.
     */
    public Port(Port other) {
        this.value = other.value();
    }

    /**
     * Constructor from a short integer value.
     *
     * @param value the value to use.
     */
    public Port(short value) {
        this.value = value;
    }

    /**
     * Constructor from a PortValues enum value.
     *
     * @param value the value to use.
     */
    public Port(PortValues value) {
        this.value = value.value();
    }

    /**
     * Get the value of the port.
     *
     * @return the value of the port.
     */
    @JsonProperty("value")
    public short value() {
        return value;
    }

    /**
     * Set the value of the port.
     *
     * @param value the value to set.
     */
    @JsonProperty("value")
    public void setValue(short value) {
        this.value = value;
    }

    /**
     * Convert the port value to a string.
     *
     * @return the port value as a string.
     */
    @Override
    public String toString() {
        return Short.toString(this.value);
    }


    @Override
    public boolean equals(Object other) {
        if (!(other instanceof Port)) {
            return false;
        }

        Port otherPort = (Port) other;

        return value == otherPort.value;
    }

    @Override
    public int hashCode() {
        int hash = 17;
        hash += 31 * hash + (int) value;
        return hash;
    }
}
