/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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 org.onosproject.net.link;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.LinkKey;
import org.onosproject.net.provider.AbstractProviderService;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class LinkProviderServiceAdapter
        extends AbstractProviderService<LinkProvider>
        implements LinkProviderService {

    List<DeviceId> vanishedDpid = Lists.newLinkedList();
    List<Long> vanishedPort = Lists.newLinkedList();
    Map<DeviceId, DeviceId> discoveredLinks = Maps.newHashMap();
    Map<LinkKey, LinkDescription> discoveredLinkDescriptions = new HashMap<>();

    protected LinkProviderServiceAdapter(LinkProvider provider) {
        super(provider);
    }

    @Override
    public void linkDetected(LinkDescription linkDescription) {
        LinkKey key = LinkKey.linkKey(linkDescription.src(), linkDescription.dst());
        discoveredLinkDescriptions.put(key, linkDescription);
        DeviceId sDid = linkDescription.src().deviceId();
        DeviceId dDid = linkDescription.dst().deviceId();
        discoveredLinks.put(sDid, dDid);
    }

    @Override
    public void linkVanished(LinkDescription linkDescription) {
        LinkKey key = LinkKey.linkKey(linkDescription.src(), linkDescription.dst());
        discoveredLinkDescriptions.remove(key);
    }

    @Override
    public void linksVanished(ConnectPoint connectPoint) {
        vanishedPort.add(connectPoint.port().toLong());

    }

    @Override
    public void linksVanished(DeviceId deviceId) {
        vanishedDpid.add(deviceId);
    }

    public List<DeviceId> vanishedDpid() {
        return vanishedDpid;
    }

    public List<Long> vanishedPort() {
        return vanishedPort;
    }

    public Map<DeviceId, DeviceId> discoveredLinks() {
        return discoveredLinks;
    }

    public Map<LinkKey, LinkDescription> discoveredLinkDescriptions() {
        return discoveredLinkDescriptions;
    }
}
