package net.onrc.onos.core.topology;

import java.nio.ByteBuffer;

import net.onrc.onos.core.topology.PortEvent.SwitchPort;

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

    /**
     * Default constructor for Serializer to use.
     */
    @Deprecated
    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.getSrcSwitch().getDpid(),
                link.getSrcPort().getNumber());
        dst = new SwitchPort(link.getDstSwitch().getDpid(),
                link.getDstPort().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 ByteBuffer getLinkID(Long src_dpid, Long src_port_no,
                                       Long dst_dpid, Long dst_port_no) {
        return (ByteBuffer) ByteBuffer.allocate(LinkEvent.LINKID_BYTES).putChar('L')
                .put(PortEvent.getPortID(src_dpid, src_port_no))
                .put(PortEvent.getPortID(dst_dpid, dst_port_no)).flip();
    }

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

    public ByteBuffer getIDasByteBuffer() {
        return getLinkID(src.getDpid(), src.getNumber(),
                dst.getDpid(), dst.getNumber());
    }

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