package net.floodlightcontroller.util;

import net.floodlightcontroller.util.MACAddress;
import net.floodlightcontroller.util.IPv4Net;

import org.codehaus.jackson.annotate.JsonProperty;

/**
 * The class representing the Flow Entry Matching filter.
 *
 * 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.
     */
    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> vlanId;	// Matching VLAN ID
    private Field<Byte> vlanPriority;	// Matching VLAN priority
    private Field<Short> ethernetFrameType; // Matching Ethernet frame type
    private Field<Byte> ipToS;		// Matching IP ToS (DSCP field, 6 bits)
    private Field<Byte> ipProto;	// Matching IP protocol
    private Field<IPv4Net> srcIPv4Net;	// Matching source IPv4 prefix
    private Field<IPv4Net> dstIPv4Net;	// Matching destination IPv4 prefix
    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.vlanId != null) && other.vlanId.enabled())
	    this.enableVlanId(other.vlanId.value());
	if ((other.vlanPriority != null) && other.vlanPriority.enabled())
	    this.enableVlanPriority(other.vlanPriority.value());
	if ((other.ethernetFrameType != null) && other.ethernetFrameType.enabled())
	    this.enableEthernetFrameType(other.ethernetFrameType.value());
	if ((other.ipToS != null) && other.ipToS.enabled())
	    this.enableIpToS(other.ipToS.value());
	if ((other.ipProto != null) && other.ipProto.enabled())
	    this.enableIpProto(other.ipProto.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.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 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 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 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 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 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 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.
     *
     * 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 (matchVlanId()) {
	    if (addSpace)
		ret += " ";
	    addSpace = true;
	    ret += "vlanId=" + this.vlanId().toString();
	}
	if (matchVlanPriority()) {
	    if (addSpace)
		ret += " ";
	    addSpace = true;
	    ret += "vlanPriority=" + this.vlanPriority().toString();
	}
	if (matchEthernetFrameType()) {
	    if (addSpace)
		ret += " ";
	    addSpace = true;
	    ret += "ethernetFrameType=" + this.ethernetFrameType().toString();
	}
	if (matchIpToS()) {
	    if (addSpace)
		ret += " ";
	    addSpace = true;
	    ret += "ipToS=" + this.ipToS().toString();
	}
	if (matchIpProto()) {
	    if (addSpace)
		ret += " ";
	    addSpace = true;
	    ret += "ipProto=" + this.ipProto().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 (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;
    }
}
