package net.onrc.onos.core.util;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Objects;


/**
 * Immutable class to identify a Link between 2 ports.
 */
public final class LinkTuple {

    private final SwitchPort src;
    private final SwitchPort dst;

    /**
     * Default constructor for Serializer.
     */
    protected LinkTuple() {
        src = null;
        dst = null;
    }

    /**
     * Constructor.
     *
     * @param src source port
     * @param dst destination port
     */
    public LinkTuple(SwitchPort src, SwitchPort dst) {
        this.src = checkNotNull(src);
        this.dst = checkNotNull(dst);
    }

    /**
     * Creates the Link object.
     *
     * @param srcDpid source switch DPID
     * @param srcPortNo source port number
     * @param dstDpid destination switch DPID
     * @param dstPortNo destination port number
     */
    public LinkTuple(Dpid srcDpid, PortNumber srcPortNo,
                     Dpid dstDpid, PortNumber dstPortNo) {
        this(new SwitchPort(srcDpid, srcPortNo),
             new SwitchPort(dstDpid, dstPortNo));
    }

    /**
     * Gets the source port.
     *
     * @return source port
     */
    public SwitchPort getSrc() {
        return src;
    }

    /**
     * Gets the destination port.
     *
     * @return destination port
     */
    public SwitchPort getDst() {
        return dst;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((src == null) ? 0 : src.hashCode());
        result = prime * result + ((dst == null) ? 0 : dst.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;
        }
        LinkTuple other = (LinkTuple) obj;
        return Objects.equals(src, other.src) &&
                Objects.equals(dst, other.dst);
    }

    @Override
    public String toString() {
        return "(" + src + "=>" + dst + ")";
    }
}
