package net.onrc.onos.core.util;

import net.floodlightcontroller.util.MACAddress;

import org.codehaus.jackson.annotate.JsonProperty;

/**
 * The class representing the Flow Entry Matching filter.
 * <p/>
 * The Flow Entry matching filter that is used to specify
 * the network data that would be forwarded on the data path from
 * the source to the destination. Examples: source or destination MAC address,
 * IP prefix that includes the destination's IP address, etc.
 */
public class FlowEntryMatch {
    /**
     * A class for storing a value to match.
     */
    public static class Field<T> {
        /**
         * Default constructor.
         */
        public Field() {
            this.enabled = false;
        }

        /**
         * Constructor for a given value to match.
         *
         * @param value the value to match.
         */
        public Field(T value) {
            this.value = value;
            this.enabled = true;
        }

        /**
         * Get the value.
         *
         * @return the value.
         */
        public T value() {
            return this.value;
        }

        /**
         * Enable the matching for a given value.
         *
         * @param value the value to set.
         */
        public void enableMatch(T value) {
            this.value = value;
            this.enabled = true;
        }

        /**
         * Disable the matching.
         */
        public void disableMatch() {
            this.enabled = false;
        }

        /**
         * Test whether matching is enabled.
         *
         * @return true if matching is enabled, otherwise false.
         */
        public boolean enabled() {
            return this.enabled;
        }

        private T value;        // The value to match
        private boolean enabled;    // Set to true, if matching is enabled
    }

    private Field<Port> inPort;        // Matching input switch port
    private Field<MACAddress> srcMac;    // Matching source MAC address
    private Field<MACAddress> dstMac;    // Matching destination MAC address
    private Field<Short> ethernetFrameType; // Matching Ethernet frame type
    private Field<Short> vlanId;    // Matching VLAN ID
    private Field<Byte> vlanPriority;    // Matching VLAN priority
    private Field<IPv4Net> srcIPv4Net;    // Matching source IPv4 prefix
    private Field<IPv4Net> dstIPv4Net;    // Matching destination IPv4 prefix
    private Field<Byte> ipProto;    // Matching IP protocol
    private Field<Byte> ipToS;        // Matching IP ToS (DSCP field, 6 bits)
    private Field<Short> srcTcpUdpPort;    // Matching source TCP/UDP port
    private Field<Short> dstTcpUdpPort;    // Matching destination TCP/UDP port

    /**
     * Default constructor.
     */
    public FlowEntryMatch() {
    }

    /**
     * Copy constructor.
     *
     * @param other the object to copy from.
     */
    public FlowEntryMatch(FlowEntryMatch other) {
        if ((other.inPort != null) && other.inPort.enabled())
            this.enableInPort(other.inPort.value());
        if ((other.srcMac != null) && other.srcMac.enabled())
            this.enableSrcMac(other.srcMac.value());
        if ((other.dstMac != null) && other.dstMac.enabled())
            this.enableDstMac(other.dstMac.value());
        if ((other.ethernetFrameType != null) && other.ethernetFrameType.enabled())
            this.enableEthernetFrameType(other.ethernetFrameType.value());
        if ((other.vlanId != null) && other.vlanId.enabled())
            this.enableVlanId(other.vlanId.value());
        if ((other.vlanPriority != null) && other.vlanPriority.enabled())
            this.enableVlanPriority(other.vlanPriority.value());
        if ((other.srcIPv4Net != null) && other.srcIPv4Net.enabled())
            this.enableSrcIPv4Net(other.srcIPv4Net.value());
        if ((other.dstIPv4Net != null) && other.dstIPv4Net.enabled())
            this.enableDstIPv4Net(other.dstIPv4Net.value());
        if ((other.ipProto != null) && other.ipProto.enabled())
            this.enableIpProto(other.ipProto.value());
        if ((other.ipToS != null) && other.ipToS.enabled())
            this.enableIpToS(other.ipToS.value());
        if ((other.srcTcpUdpPort != null) && other.srcTcpUdpPort.enabled())
            this.enableSrcTcpUdpPort(other.srcTcpUdpPort.value());
        if ((other.dstTcpUdpPort != null) && other.dstTcpUdpPort.enabled())
            this.enableDstTcpUdpPort(other.dstTcpUdpPort.value());
    }

    /**
     * Get the matching input switch port.
     *
     * @return the matching input switch port.
     */
    @JsonProperty("inPort")
    public Port inPort() {
        if (inPort != null)
            return inPort.value();
        return null;
    }

    /**
     * Enable the matching on input switch port.
     *
     * @param inPort the input switch port value to enable for matching.
     */
    @JsonProperty("inPort")
    public void enableInPort(Port inPort) {
        this.inPort = new Field<Port>(inPort);
    }

    /**
     * Disable the matching on input switch port.
     */
    public void disableInPort() {
        this.inPort = null;
    }

    /**
     * Test if matching on input switch port is enabled.
     *
     * @return true if matching on input switch port is enabled.
     */
    @JsonProperty("matchInPort")
    public boolean matchInPort() {
        if (inPort != null)
            return inPort.enabled();
        return false;
    }

    /**
     * Get the matching source MAC address.
     *
     * @return the matching source MAC address.
     */
    @JsonProperty("srcMac")
    public MACAddress srcMac() {
        if (srcMac != null)
            return srcMac.value();
        return null;
    }

    /**
     * Enable the matching on source MAC address.
     *
     * @param srcMac the source MAC address value to enable for matching.
     */
    @JsonProperty("srcMac")
    public void enableSrcMac(MACAddress srcMac) {
        this.srcMac = new Field<MACAddress>(srcMac);
    }

    /**
     * Disable the matching on source MAC address.
     */
    public void disableSrcMac() {
        this.srcMac = null;
    }

    /**
     * Test if matching on source MAC address is enabled.
     *
     * @return true if matching on source MAC address is enabled.
     */
    @JsonProperty("matchSrcMac")
    public boolean matchSrcMac() {
        if (srcMac != null)
            return srcMac.enabled();
        return false;
    }

    /**
     * Get the matching destination MAC address.
     *
     * @return the matching destination MAC address.
     */
    @JsonProperty("dstMac")
    public MACAddress dstMac() {
        if (dstMac != null)
            return dstMac.value();
        return null;
    }

    /**
     * Enable the matching on destination MAC address.
     *
     * @param dstMac the destination MAC address value to enable for matching.
     */
    @JsonProperty("dstMac")
    public void enableDstMac(MACAddress dstMac) {
        this.dstMac = new Field<MACAddress>(dstMac);
    }

    /**
     * Disable the matching on destination MAC address.
     */
    public void disableDstMac() {
        this.dstMac = null;
    }

    /**
     * Test if matching on destination MAC address is enabled.
     *
     * @return true if matching on destination MAC address is enabled.
     */
    @JsonProperty("matchDstMac")
    public boolean matchDstMac() {
        if (dstMac != null)
            return dstMac.enabled();
        return false;
    }

    /**
     * Get the matching Ethernet frame type.
     *
     * @return the matching Ethernet frame type.
     */
    @JsonProperty("ethernetFrameType")
    public Short ethernetFrameType() {
        if (ethernetFrameType != null)
            return ethernetFrameType.value();
        return null;
    }

    /**
     * Enable the matching on Ethernet frame type.
     *
     * @param ethernetFrameType the Ethernet frame type value to enable for
     *                          matching.
     */
    @JsonProperty("ethernetFrameType")
    public void enableEthernetFrameType(Short ethernetFrameType) {
        this.ethernetFrameType = new Field<Short>(ethernetFrameType);
    }

    /**
     * Disable the matching on Ethernet frame type.
     */
    public void disableEthernetFrameType() {
        this.ethernetFrameType = null;
    }

    /**
     * Test if matching on Ethernet frame type is enabled.
     *
     * @return true if matching on Ethernet frame type is enabled.
     */
    @JsonProperty("matchEthernetFrameType")
    public boolean matchEthernetFrameType() {
        if (ethernetFrameType != null)
            return ethernetFrameType.enabled();
        return false;
    }

    /**
     * Get the matching VLAN ID.
     *
     * @return the matching VLAN ID.
     */
    @JsonProperty("vlanId")
    public Short vlanId() {
        if (vlanId != null)
            return vlanId.value();
        return null;
    }

    /**
     * Enable the matching on VLAN ID.
     *
     * @param vlanId the VLAN ID value to enable for matching.
     */
    @JsonProperty("vlanId")
    public void enableVlanId(Short vlanId) {
        this.vlanId = new Field<Short>(vlanId);
    }

    /**
     * Disable the matching on VLAN ID.
     */
    public void disableVlanId() {
        this.vlanId = null;
    }

    /**
     * Test if matching on VLAN ID is enabled.
     *
     * @return true if matching on VLAN ID is enabled.
     */
    @JsonProperty("matchVlanId")
    public boolean matchVlanId() {
        if (vlanId != null)
            return vlanId.enabled();
        return false;
    }

    /**
     * Get the matching VLAN priority.
     *
     * @return the matching VLAN priority.
     */
    @JsonProperty("vlanPriority")
    public Byte vlanPriority() {
        if (vlanPriority != null)
            return vlanPriority.value();
        return null;
    }

    /**
     * Enable the matching on VLAN priority.
     *
     * @param vlanPriority the VLAN priority value to enable for matching.
     */
    @JsonProperty("vlanPriority")
    public void enableVlanPriority(Byte vlanPriority) {
        this.vlanPriority = new Field<Byte>(vlanPriority);
    }

    /**
     * Disable the matching on VLAN priority.
     */
    public void disableVlanPriority() {
        this.vlanPriority = null;
    }

    /**
     * Test if matching on VLAN priority is enabled.
     *
     * @return true if matching on VLAN priority is enabled.
     */
    @JsonProperty("matchVlanPriority")
    public boolean matchVlanPriority() {
        if (vlanPriority != null)
            return vlanPriority.enabled();
        return false;
    }

    /**
     * Get the matching source IPv4 prefix.
     *
     * @return the matching source IPv4 prefix.
     */
    @JsonProperty("srcIPv4Net")
    public IPv4Net srcIPv4Net() {
        if (srcIPv4Net != null)
            return srcIPv4Net.value();
        return null;
    }

    /**
     * Enable the matching on source IPv4 prefix.
     *
     * @param srcIPv4Net the source IPv4 prefix value to enable for matching.
     */
    @JsonProperty("srcIPv4Net")
    public void enableSrcIPv4Net(IPv4Net srcIPv4Net) {
        this.srcIPv4Net = new Field<IPv4Net>(srcIPv4Net);
    }

    /**
     * Disable the matching on source IPv4 prefix.
     */
    public void disableSrcIPv4Net() {
        this.srcIPv4Net = null;
    }

    /**
     * Test if matching on source IPv4 prefix is enabled.
     *
     * @return true if matching on source IPv4 prefix is enabled.
     */
    @JsonProperty("matchSrcIPv4Net")
    public boolean matchSrcIPv4Net() {
        if (srcIPv4Net != null)
            return srcIPv4Net.enabled();
        return false;
    }

    /**
     * Get the matching destination IPv4 prefix.
     *
     * @return the matching destination IPv4 prefix.
     */
    @JsonProperty("dstIPv4Net")
    public IPv4Net dstIPv4Net() {
        if (dstIPv4Net != null)
            return dstIPv4Net.value();
        return null;
    }

    /**
     * Enable the matching on destination IPv4 prefix.
     *
     * @param dstIPv4Net the destination IPv4 prefix value to enable for
     *                   matching.
     */
    @JsonProperty("dstIPv4Net")
    public void enableDstIPv4Net(IPv4Net dstIPv4Net) {
        this.dstIPv4Net = new Field<IPv4Net>(dstIPv4Net);
    }

    /**
     * Disable the matching on destination IPv4 prefix.
     */
    public void disableDstIPv4Net() {
        this.dstIPv4Net = null;
    }

    /**
     * Test if matching on destination IPv4 prefix is enabled.
     *
     * @return true if matching on destination IPv4 prefix is enabled.
     */
    @JsonProperty("matchDstIPv4Net")
    public boolean matchDstIPv4Net() {
        if (dstIPv4Net != null)
            return dstIPv4Net.enabled();
        return false;
    }

    /**
     * Get the matching IP protocol.
     *
     * @return the matching IP protocol.
     */
    @JsonProperty("ipProto")
    public Byte ipProto() {
        if (ipProto != null)
            return ipProto.value();
        return null;
    }

    /**
     * Enable the matching on IP protocol.
     *
     * @param ipProto the IP protocol value to enable for matching.
     */
    @JsonProperty("ipProto")
    public void enableIpProto(Byte ipProto) {
        this.ipProto = new Field<Byte>(ipProto);
    }

    /**
     * Disable the matching on IP protocol.
     */
    public void disableIpProto() {
        this.ipProto = null;
    }

    /**
     * Test if matching on IP protocol is enabled.
     *
     * @return true if matching on IP protocol is enabled.
     */
    @JsonProperty("matchIpProto")
    public boolean matchIpProto() {
        if (ipProto != null)
            return ipProto.enabled();
        return false;
    }

    /**
     * Get the matching IP ToS (DSCP field, 6 bits)
     *
     * @return the matching IP ToS.
     */
    @JsonProperty("ipToS")
    public Byte ipToS() {
        if (ipToS != null)
            return ipToS.value();
        return null;
    }

    /**
     * Enable the matching on IP ToS (DSCP field, 6 bits).
     *
     * @param ipToS the IP ToS value to enable for matching.
     */
    @JsonProperty("ipToS")
    public void enableIpToS(Byte ipToS) {
        this.ipToS = new Field<Byte>(ipToS);
    }

    /**
     * Disable the matching on IP ToS (DSCP field, 6 bits).
     */
    public void disableIpToS() {
        this.ipToS = null;
    }

    /**
     * Test if matching on IP ToS (DSCP field, 6 bits) is enabled.
     *
     * @return true if matching on IP ToS is enabled.
     */
    @JsonProperty("matchIpToS")
    public boolean matchIpToS() {
        if (ipToS != null)
            return ipToS.enabled();
        return false;
    }

    /**
     * Get the matching source TCP/UDP port.
     *
     * @return the matching source TCP/UDP port.
     */
    @JsonProperty("srcTcpUdpPort")
    public Short srcTcpUdpPort() {
        if (srcTcpUdpPort != null)
            return srcTcpUdpPort.value();
        return null;
    }

    /**
     * Enable the matching on source TCP/UDP port.
     *
     * @param srcTcpUdpPort the source TCP/UDP port to enable for matching.
     */
    @JsonProperty("srcTcpUdpPort")
    public void enableSrcTcpUdpPort(Short srcTcpUdpPort) {
        this.srcTcpUdpPort = new Field<Short>(srcTcpUdpPort);
    }

    /**
     * Disable the matching on source TCP/UDP port.
     */
    public void disableSrcTcpUdpPort() {
        this.srcTcpUdpPort = null;
    }

    /**
     * Test if matching on source TCP/UDP port is enabled.
     *
     * @return true if matching on source TCP/UDP port is enabled.
     */
    @JsonProperty("matchSrcTcpUdpPort")
    public boolean matchSrcTcpUdpPort() {
        if (srcTcpUdpPort != null)
            return srcTcpUdpPort.enabled();
        return false;
    }

    /**
     * Get the matching destination TCP/UDP port.
     *
     * @return the matching destination TCP/UDP port.
     */
    @JsonProperty("dstTcpUdpPort")
    public Short dstTcpUdpPort() {
        if (dstTcpUdpPort != null)
            return dstTcpUdpPort.value();
        return null;
    }

    /**
     * Enable the matching on destination TCP/UDP port.
     *
     * @param dstTcpUdpPort the destination TCP/UDP port to enable for
     *                      matching.
     */
    @JsonProperty("dstTcpUdpPort")
    public void enableDstTcpUdpPort(Short dstTcpUdpPort) {
        this.dstTcpUdpPort = new Field<Short>(dstTcpUdpPort);
    }

    /**
     * Disable the matching on destination TCP/UDP port.
     */
    public void disableDstTcpUdpPort() {
        this.dstTcpUdpPort = null;
    }

    /**
     * Test if matching on destination TCP/UDP port is enabled.
     *
     * @return true if matching on destination TCP/UDP port is enabled.
     */
    @JsonProperty("matchDstTcpUdpPort")
    public boolean matchDstTcpUdpPort() {
        if (dstTcpUdpPort != null)
            return dstTcpUdpPort.enabled();
        return false;
    }

    /**
     * Convert the matching filter to a string.
     * <p/>
     * The string has the following form:
     * [srcMac=XXX dstMac=XXX srcIPv4Net=XXX dstIPv4Net=XXX]
     *
     * @return the matching filter as a string.
     */
    @Override
    public String toString() {
        String ret = "[";
        boolean addSpace = false;

        //
        // Conditionally add only those matching fields that are enabled
        //
        if (matchInPort()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "inPort=" + this.inPort().toString();
        }
        if (matchSrcMac()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "srcMac=" + this.srcMac().toString();
        }
        if (matchDstMac()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "dstMac=" + this.dstMac().toString();
        }
        if (matchEthernetFrameType()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "ethernetFrameType=" + this.ethernetFrameType().toString();
        }
        if (matchVlanId()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "vlanId=" + this.vlanId().toString();
        }
        if (matchVlanPriority()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "vlanPriority=" + this.vlanPriority().toString();
        }
        if (matchSrcIPv4Net()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "srcIPv4Net=" + this.srcIPv4Net().toString();
        }
        if (matchDstIPv4Net()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "dstIPv4Net=" + this.dstIPv4Net().toString();
        }
        if (matchIpProto()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "ipProto=" + this.ipProto().toString();
        }
        if (matchIpToS()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "ipToS=" + this.ipToS().toString();
        }
        if (matchSrcTcpUdpPort()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "srcTcpUdpPort=" + this.srcTcpUdpPort().toString();
        }
        if (matchDstTcpUdpPort()) {
            if (addSpace)
                ret += " ";
            addSpace = true;
            ret += "dstTcpUdpPort=" + this.dstTcpUdpPort().toString();
        }

        ret += "]";

        return ret;
    }
}
