package net.onrc.onos.core.intent;

import java.util.Arrays;

import net.floodlightcontroller.util.MACAddress;
//import net.onrc.onos.core.topology.Port;
//import net.onrc.onos.core.topology.Switch;
import net.onrc.onos.core.util.FlowEntryMatch;

/**
 *
 * @author Brian O'Connor <bocon@onlab.us>
 *
 */

public class Match {
	protected long sw;
	protected MACAddress srcMac;
	protected MACAddress dstMac;
	protected long srcPort;
	
	public Match(long sw, long srcPort, 
		     MACAddress srcMac, MACAddress dstMac) {
		this.sw = sw;
		this.srcPort = srcPort;
		this.srcMac = srcMac;
		this.dstMac = dstMac;
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Match) {
			Match other = (Match) obj;
			return this.sw == other.sw &&
			       this.srcMac.equals(other.srcMac) &&
			       this.dstMac.equals(other.dstMac) &&
			       this.srcPort == other.srcPort;
		}
		else {
			return false;
		}
	}

	public FlowEntryMatch getFlowEntryMatch(){
	    FlowEntryMatch match = new FlowEntryMatch();
	    match.enableSrcMac(srcMac);
	    match.enableDstMac(dstMac);
	    match.enableInPort(new net.onrc.onos.core.util.Port((short) srcPort));
	    return match;
	}

	@Override
	public String toString() {
		return "Sw:" + sw + " (" + srcPort + "," + srcMac + "," + dstMac + ")";
	}
	
	@Override
	public int hashCode() {
	    long[] nums = new long[4];
	    nums[0] = sw;
	    nums[1] = srcPort;
	    nums[2] = srcMac.toLong();
	    nums[3] = dstMac.toLong();
	    return Arrays.hashCode(nums);
	}
}
