/*
 * 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.tl1;

import com.google.common.annotations.Beta;
import org.onosproject.net.DeviceId;

import java.util.Collection;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;

@Beta
public interface Tl1Controller {
    /**
     * Sends the message to the device asynchronously.
     *
     * @param deviceId the device to write to
     * @param msg the message to write
     * @return the device response
     */
    // TODO: return CompletableFuture<Tl1Message> once we have appropriate builders
    CompletableFuture<String> sendMsg(DeviceId deviceId, Tl1Command msg);

    /**
     * Returns the device identified by given ID.
     *
     * @param deviceId the device ID to lookup
     * @return optional Tl1Device
     */
    Optional<Tl1Device> getDevice(DeviceId deviceId);

    /**
    /**
     * Adds a device to the controller.
     * @param deviceId the device ID to add
     * @param device the device to add
     * @return true if device added, false if already known
     */
    boolean addDevice(DeviceId deviceId, Tl1Device device);

    /**
     * Disconnects the device and removes it from the controller.
     * @param deviceId the device to remove
     */
    void removeDevice(DeviceId deviceId);

    /**
     * Connects the controller to the device.
     * @param deviceId the device to disconnect to
     */
    void connectDevice(DeviceId deviceId);

    /**
     * Disconnects the device from the controller.
     * @param deviceId the device to disconnect from
     */
    void disconnectDevice(DeviceId deviceId);

    /**
     * Returns a set of all devices IDs for this TL1 controller.
     * @return set of device IDs
     */
    Set<DeviceId> getDeviceIds();

    /**
     * Returns a set of all devices for this TL1 controller.
     * @return collection of TL1 devices
     */
    Collection<Tl1Device> getDevices();

    /**
     * Registers a listener for TL1 events.
     *
     * @param listener the listener to notify
     */
    void addListener(Tl1Listener listener);

    /**
     * Unregisters a listener for TL1 events.
     *
     * @param listener the listener to unregister
     */
    void removeListener(Tl1Listener listener);
}
