package net.onrc.onos.core.topology;

import java.util.Map;

import net.onrc.onos.core.util.LinkTuple;

import org.apache.commons.lang.Validate;

/**
 * Handler to Link object stored in In-memory Topology snapshot.
 * <p/>
 */
public class LinkImpl extends TopologyObject implements Link {

    private final LinkTuple id;


    /**
     * Creates a Link handler object.
     *
     * @param topology Topology instance this object belongs to
     * @param linkTuple Link identifier
     */
    LinkImpl(TopologyInternal topology, LinkTuple linkTuple) {
        super(topology);
        Validate.notNull(linkTuple);
        this.id = linkTuple;
    }

    @Override
    public LinkTuple getLinkTuple() {
        return id;
    }

    @Override
    public Switch getSrcSwitch() {
        topology.acquireReadLock();
        try {
            return topology.getSwitch(id.getSrc().getDpid());
        } finally {
            topology.releaseReadLock();
        }
    }

    @Override
    public Port getSrcPort() {
        topology.acquireReadLock();
        try {
            return topology.getPort(id.getSrc());
        } finally {
            topology.releaseReadLock();
        }
    }

    @Override
    public Switch getDstSwitch() {
        topology.acquireReadLock();
        try {
            return topology.getSwitch(id.getDst().getDpid());
        } finally {
            topology.releaseReadLock();
        }
    }

    @Override
    public Port getDstPort() {
        topology.acquireReadLock();
        try {
            return topology.getPort(id.getDst());
        } finally {
            topology.releaseReadLock();
        }
    }

    @Override
    public long getLastSeenTime() {
        // TODO Auto-generated method stub
        throw new UnsupportedOperationException("Not implemented yet");
    }

    @Override
    public Double getCapacity() {
        return this.topology.getLinkEvent(id).getCapacity();
    }

    @Override
    public String getStringAttribute(String attr) {
        return this.topology.getLinkEvent(id).getStringAttribute(attr);
    }

    @Override
    public String getStringAttribute(String attr, String def) {
        final String v = getStringAttribute(attr);
        if (v == null) {
            return def;
        } else {
            return v;
        }
    }

    @Override
    public Map<String, String> getAllStringAttributes() {
        return this.topology.getLinkEvent(id).getAllStringAttributes();
    }

    @Override
    public String toString() {
        return String.format("%s --(cap:%f Mbps)--> %s",
                getSrcPort().toString(),
                getCapacity(),
                getDstPort().toString());
    }


    /**
     * Returns the type of topology object.
     *
     * @return the type of the topology object
     */
    @Override
    public String getType() {
        return getStringAttribute(TopologyElement.TYPE, TopologyElement.TYPE_PACKET_LAYER);
    }
}
