/*
 * Copyright 2016 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.isis.controller.topology;

import java.util.Map;

/**
 * Represents IP topology for ISIS device and link details.
 */
public interface TopologyForDeviceAndLink {

    /**
     * Gets the device information.
     *
     * @return device information
     */
    Map<String, DeviceInformation> deviceInformationMap();

    /**
     * Sets the device information.
     *
     * @param key                  system ID of the device as key
     * @param deviceInformationMap device information instance
     */
    void setDeviceInformationMap(String key, DeviceInformation deviceInformationMap);

    /**
     * Gets the link information.
     *
     * @return link information
     */
    Map<String, LinkInformation> linkInformationMap();

    /**
     * Sets link information.
     *
     * @param key                system ID of the device as key
     * @param linkInformationMap link information instance
     */
    void setLinkInformationMap(String key, LinkInformation linkInformationMap);

    /**
     * Removes link information.
     *
     * @param key key used to remove from map
     */
    void removeLinkInformationMap(String key);

    /**
     * Removes device information.
     *
     * @param key key used to remove from map
     */
    void removeDeviceInformationMap(String key);

    /**
     * Removes links from linkInformationMap.
     *
     * @param linkId ID
     */
    void removeLinks(String linkId);

    /**
     * Gets deviceInformation as map.
     *
     * @return deviceInformationMap to delete from core
     */
    Map<String, DeviceInformation> deviceInformationMapToDelete();

    /**
     * Sets deviceInformation as map.
     *
     * @param key                          key used to add in map
     * @param deviceInformationMapToDelete device information to delete from map
     */
    void setDeviceInformationMapToDelete(String key, DeviceInformation deviceInformationMapToDelete);

    /**
     * Removes Device Information from deviceInformationMapToDelete.
     *
     * @param key key to remove from map
     */
    void removeDeviceInformationMapFromDeleteMap(String key);

    /**
     * Gets deviceInformation as map for Point-To-Point.
     *
     * @return deviceInformationMap
     */
    Map<String, DeviceInformation> deviceInformationMapForPointToPoint();

    /**
     * Sets deviceInformation as map for Point-To-Point..
     *
     * @param key                  key to add to map
     * @param deviceInformationMap device information map
     */
    void setDeviceInformationMapForPointToPoint(String key, DeviceInformation deviceInformationMap);

    /**
     * Gets linkInformation as map for PointToPoint.
     *
     * @return linkInformationMap
     */
    Map<String, LinkInformation> linkInformationMapForPointToPoint();

    /**
     * Sets linkInformation as map for PointToPoint.
     *
     * @param key                key to add link information to map
     * @param linkInformationMap link information to add
     */
    void setLinkInformationMapForPointToPoint(String key, LinkInformation linkInformationMap);
}