/**
 *    Copyright 2011, Big Switch Networks, Inc.
 *    Originally created by David Erickson, Stanford University
 *
 *    Licensed under the Apache License, Version 2.0 (the "License"); you may
 *    not use this file except in compliance with the License. You may obtain
 *    a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *    License for the specific language governing permissions and limitations
 *    under the License.
 **/

package net.onrc.onos.core.linkdiscovery;

import java.util.Set;

import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService.LinkType;

import org.projectfloodlight.openflow.protocol.OFPortState;

import com.google.common.primitives.Longs;

/**
 * Records information about a link.
 */
public final class LinkInfo {
    /**
     * The port states stored here are topology's last knowledge of the state of
     * the port. This mostly mirrors the state maintained in the port list in
     * IOFSwitch (i.e. the one returned from getPort), except that during a port
     * status message the IOFSwitch port state will already have been updated
     * with the new port state, so topology needs to keep its own copy so that
     * it can determine if the port state has changed and therefore requires the
     * new state to be written to storage. Note the port state values are
     * defined in the OF 1.0 spec. These will change in some way once we move to
     * OF 1.3.
     */
    private final Set<OFPortState> srcPortState;
    private final Set<OFPortState> dstPortState;

    private final long firstSeenTime;
    private final long lastLldpReceivedTime;

    /**
     * Constructs a LinkInfo object.
     *
     * @param firstSeenTime the timestamp when the link was first seen
     * @param lastLldpReceivedTime the timestamp when the link was last seen
     * @param srcPortState the port state of the source port
     * @param dstPortState the port state of the destination port
     */
    public LinkInfo(long firstSeenTime,
            long lastLldpReceivedTime,
            Set<OFPortState> srcPortState,
            Set<OFPortState> dstPortState) {
        this.srcPortState = srcPortState;
        this.dstPortState = dstPortState;
        this.firstSeenTime = firstSeenTime;
        this.lastLldpReceivedTime = lastLldpReceivedTime;
    }

    /**
     * Gets the timestamp when the link was first seen.
     *
     * @return the first seen timestamp
     */
    public long getFirstSeenTime() {
        return firstSeenTime;
    }

    /**
     * Gets the timestamp when the link was last seen.
     *
     * @return the last seen timestamp
     */
    public long getLastProbeReceivedTime() {
        return lastLldpReceivedTime;
    }

    /**
     * Gets the state of the source port.
     *
     * @return the source port state, as defined in the OF1.0 spec
     */
    public Set<OFPortState> getSrcPortState() {
        return srcPortState;
    }

    public int getSrcPortStateInteger() {
        return convertPortState(srcPortState);
    }

    /**
     * Gets the state of the destination port.
     *
     * @return the destination port state, as defined in the OF1.0 spec
     */
    public Set<OFPortState> getDstPortState() {
        return dstPortState;
    }

    /**
     * Gets the state of the destination port.
     *
     * @return the destination port state, as defined in the OF1.0 spec
     */
    public int getDstPortStateInteger() {
        return convertPortState(dstPortState);
    }

    private int convertPortState(Set<OFPortState> ps) {
        int ret = 0;
        if (ps.contains(OFPortState.LINK_DOWN)) {
            ret = 1 << 0;
        }
        if (ps.contains(OFPortState.BLOCKED)) {
            ret = ret | 1 << 1;
        }
        if (ps.contains(OFPortState.LIVE)) {
            ret = ret | 1 << 2;
        }
        return ret;
    }

    /**
     * Gets the link type.
     *
     * @return the link type
     * @see LinkType
     */
    public LinkType getLinkType() {
        return LinkType.DIRECT_LINK;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 5557;
        int result = 1;
        result = prime * result + Longs.hashCode(firstSeenTime);
        result = prime * result + Longs.hashCode(lastLldpReceivedTime);
        result = prime * result + convertPortState(srcPortState);
        result = prime * result + convertPortState(dstPortState);
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (!(obj instanceof LinkInfo)) {
            return false;
        }

        LinkInfo other = (LinkInfo) obj;

        return firstSeenTime == other.firstSeenTime &&
                lastLldpReceivedTime == other.lastLldpReceivedTime &&
                srcPortState == other.srcPortState &&
                dstPortState == other.dstPortState;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "LinkInfo [unicastValidTime=" + lastLldpReceivedTime
                + ", srcPortState=" + srcPortState
                + ", dstPortState=" + dstPortState
                + "]";
    }
}
