package net.onrc.onos.ofcontroller.networkgraph;

import java.nio.ByteBuffer;

import net.onrc.onos.ofcontroller.networkgraph.PortEvent.SwitchPort;

/**
 * Self-contained Link event Object
 *
 * TODO: We probably want common base class/interface for Self-Contained Event Object
 *
 */
public class LinkEvent {
    private final SwitchPort src;
    private final SwitchPort dst;

    /**
     * Default constructor.
     */
    public LinkEvent() {
	src = null;
	dst = null;
    }

    public LinkEvent(Long src_dpid, Long src_port_no, Long dst_dpid,
	    Long dst_port_no) {
	src = new SwitchPort(src_dpid, src_port_no);
	dst = new SwitchPort(dst_dpid, dst_port_no);
    }

    public LinkEvent(Link link) {
	src = new SwitchPort(link.getSourceSwitch().getDpid(),
		link.getSourcePort().getNumber());
	dst = new SwitchPort(link.getDestinationSwitch().getDpid(),
		link.getDestinationPort().getNumber());
    }

    public SwitchPort getSrc() {
	return src;
    }

    public SwitchPort getDst() {
	return dst;
    }

    @Override
    public String toString() {
	return "[LinkEvent " + src + "->" + dst + "]";
    }

    public static final int LINKID_BYTES = 2 + PortEvent.PORTID_BYTES * 2;

    public static byte[] getLinkID(Long src_dpid, Long src_port_no,
	    Long dst_dpid, Long dst_port_no) {
	return ByteBuffer.allocate(LinkEvent.LINKID_BYTES).putChar('L')
		.put(PortEvent.getPortID(src_dpid, src_port_no))
		.put(PortEvent.getPortID(dst_dpid, dst_port_no)).array();
    }

    public byte[] getID() {
	return getLinkID(src.getDpid(), src.getNumber(),
		dst.getDpid(), dst.getNumber());
    }

    public Link getLink(NetworkGraph graph) {
	Port srcPort = graph.getPort(getSrc().getDpid(), getSrc().getNumber());
	if (srcPort == null) return null;
	Link link = srcPort.getOutgoingLink();
	if (link == null) return null;
	if (link.getDestinationSwitch().getDpid() != getDst().getDpid()) return null;
	if (link.getDestinationPort().getNumber() != getDst().getNumber()) return null;
	return link;
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((dst == null) ? 0 : dst.hashCode());
	result = prime * result + ((src == null) ? 0 : src.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	LinkEvent other = (LinkEvent) obj;
	if (dst == null) {
	    if (other.dst != null)
		return false;
	} else if (!dst.equals(other.dst))
	    return false;
	if (src == null) {
	    if (other.src != null)
		return false;
	} else if (!src.equals(other.src))
	    return false;
	return true;
    }
}