package net.onrc.onos.ofcontroller.bgproute;

import java.net.InetAddress;

import net.onrc.onos.ofcontroller.util.Dpid;
import net.onrc.onos.ofcontroller.util.Port;
import net.onrc.onos.ofcontroller.util.SwitchPort;

import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;
import org.openflow.util.HexString;

import com.google.common.net.InetAddresses;

public class Interface {
	private final String name;
	private final long dpid;
	private final short port;
	private final InetAddress ipAddress;
	private final int prefixLength;
	
	@JsonCreator
	public Interface (@JsonProperty("name") String name,
					  @JsonProperty("dpid") String dpid,
					  @JsonProperty("port") short port,
					  @JsonProperty("ipAddress") String ipAddress,
					  @JsonProperty("prefixLength") int prefixLength) {
		this.name = name;
		this.dpid = HexString.toLong(dpid);
		this.port = port;
		this.ipAddress = InetAddresses.forString(ipAddress);
		this.prefixLength = prefixLength;
	}
	
	public String getName() {
		return name;
	}

	public SwitchPort getSwitchPort() {
		//TODO SwitchPort, Dpid and Port are mutable, but they could probably
		//be made immutable which would prevent the need to copy
		return new SwitchPort(new Dpid(dpid), new Port(port));
	}
	
	public long getDpid() {
		return dpid;
	}

	public short getPort() {
		return port;
	}

	public InetAddress getIpAddress() {
		return ipAddress;
	}

	public int getPrefixLength() {
		return prefixLength;
	}
	
	@Override
	public boolean equals(Object other) {
		if (other == null || !(other instanceof Interface)) {
			return false;
		}
		
		Interface otherInterface = (Interface)other;
		
		//Don't check switchPort as it's comprised of dpid and port
		return (name.equals(otherInterface.name)) &&
				(dpid == otherInterface.dpid) &&
				(port == otherInterface.port) &&
				(ipAddress.equals(otherInterface.ipAddress)) &&
				(prefixLength == otherInterface.prefixLength);
	}
	
	@Override
	public int hashCode() {
		int hash = 17;
		hash = 31 * hash + name.hashCode();
		hash = 31 * hash + (int)(dpid ^ dpid >>> 32);
		hash = 31 * hash + (int)port;
		hash = 31 * hash + ipAddress.hashCode();
		hash = 31 * hash + prefixLength;
		return hash;
	}
}
