package net.onrc.onos.apps.bgproute;

import java.net.InetAddress;

import com.google.common.net.InetAddresses;

public class RibEntry {
    private final InetAddress routerId;
    private final InetAddress nextHop;

    /*
     * Store the sequence number information provided on the update here for
     * now. I think this *should* really be in the RibUpdate, and we should
     * store RibUpdates in the Ptrie. But, that's a bigger change to change
     * what the Ptrie stores.
     */
    private final long sysUpTime;
    private final long sequenceNum;

    /*
     * Marker for RibEntries where we don't have sequence number info.
     * The user of this class should make sure they don't check this data
     * if they don't provide it.
     */
    private final static long NULL_TIME = -1;

    public RibEntry(InetAddress routerId, InetAddress nextHop) {
        this.routerId = routerId;
        this.nextHop = nextHop;
        sequenceNum = NULL_TIME;
        sysUpTime = NULL_TIME;
    }

    public RibEntry(String routerId, String nextHop) {
        this.routerId = InetAddresses.forString(routerId);
        this.nextHop = InetAddresses.forString(nextHop);
        sequenceNum = NULL_TIME;
        sysUpTime = NULL_TIME;
    }

    public RibEntry(String routerId, String nextHop, long sysUpTime
            , long sequenceNum) {
        this.routerId = InetAddresses.forString(routerId);
        this.nextHop = InetAddresses.forString(nextHop);
        this.sequenceNum = sequenceNum;
        this.sysUpTime = sysUpTime;
    }

    public InetAddress getNextHop() {
        return nextHop;
    }

    public long getSysUpTime() {
        return sysUpTime;
    }

    public long getSequenceNum() {
        return sequenceNum;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null || !(other instanceof RibEntry)) {
            return false;
        }

        RibEntry otherRibEntry = (RibEntry) other;

        return this.routerId.equals(otherRibEntry.routerId)
                && this.nextHop.equals(otherRibEntry.nextHop);
    }

    @Override
    public int hashCode() {
        int hash = 17;
        hash = 31 * hash + routerId.hashCode();
        hash = 31 * hash + nextHop.hashCode();
        return hash;
    }
}
