/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.snmp;

import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import com.google.common.annotations.Beta;

import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
import org.onosproject.net.DeviceId;

import java.io.IOException;
import java.net.URI;
import java.util.Collection;

/**
 * Snmp Controller.
 */
@Beta
public interface SnmpController {

    /**
     * Return all the devices that this controller has notion of.
     * @return Set of all Snmp devices
     */
    Collection<SnmpDevice> getDevices();

    /**
     * Gets a device for a specific deviceId.
     * @param deviceId device id of the device
     * @return SnmpDevice for given deviceId
     */
    SnmpDevice getDevice(DeviceId deviceId);

    /**
     * Gets a device for a specific host address.
     *
     * @param uri URI of the device
     * @return SnmpDevice for given deviceId
     */
    SnmpDevice getDevice(URI uri);

    /**
     * Removes a specific device.
     * @param deviceId device id of the device to be removed
     */
    void removeDevice(DeviceId deviceId);

    /**
     * Add a snmp device.
     *
     * @param device device to add to this controller
     */
    void addDevice(SnmpDevice device);

    /**
     * Gets an Instance of ISnmpSession for a specific device.
     *
     * @param deviceId device to retrieve the session for.
     * @return ISnmp session.
     * @throws IOException if the session can't be established.
     * @deprecated 1.14.0 moved to snmp4j
     */
    @Deprecated
    ISnmpSession getSession(DeviceId deviceId) throws IOException;

    /**
     * Creates an error alarm if the interaction with the device failed.
     *
     * @param deviceId the device with a failed interaction
     * @return default alarm error
     */
    DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId);


}
