package net.onrc.onos.core.topology;

import java.net.InetAddress;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

import net.floodlightcontroller.util.MACAddress;

/**
 * @author Toshio Koide (t-koide@onlab.us)
 */
public class DeviceImpl extends NetworkGraphObject implements Device {

    private final MACAddress macAddr;
    protected LinkedList<Port> attachmentPoints;
    protected Set<InetAddress> ipAddresses;
    private long lastSeenTime;

    public DeviceImpl(NetworkGraph graph, MACAddress mac) {
        super(graph);
        this.macAddr = mac;
        this.attachmentPoints = new LinkedList<>();
        this.ipAddresses = new HashSet<>();
    }

    @Override
    public MACAddress getMacAddress() {
        return this.macAddr;
    }

    @Override
    public Collection<InetAddress> getIpAddress() {
        return Collections.unmodifiableSet(ipAddresses);
    }

    @Override
    public Iterable<Port> getAttachmentPoints() {
        return Collections.unmodifiableList(this.attachmentPoints);
    }

    @Override
    public long getLastSeenTime() {
        return lastSeenTime;
    }

    @Override
    public String toString() {
        return macAddr.toString();
    }

    void setLastSeenTime(long lastSeenTime) {
        this.lastSeenTime = lastSeenTime;
    }

    /**
     * Only {@link TopologyManager} should use this method.
     *
     * @param p
     */
    void addAttachmentPoint(Port p) {
        this.attachmentPoints.remove(p);
        this.attachmentPoints.addFirst(p);
    }

    /**
     * Only {@link TopologyManager} should use this method.
     *
     * @param p
     */
    boolean removeAttachmentPoint(Port p) {
        return this.attachmentPoints.remove(p);
    }

    /**
     * Only {@link TopologyManager} should use this method.
     *
     * @param p
     */
    boolean addIpAddress(InetAddress addr) {
        return this.ipAddresses.add(addr);
    }

    /**
     * Only {@link TopologyManager} should use this method.
     *
     * @param p
     */
    boolean removeIpAddress(InetAddress addr) {
        return this.ipAddresses.remove(addr);
    }
}
