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;
    }
}
