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

import java.io.InputStream;
import java.util.Map;

import javax.ws.rs.core.MediaType;

import org.onlab.packet.IpAddress;
import org.onosproject.net.DeviceId;
import org.onosproject.protocol.rest.RestSBDevice;

/**
 * Abstraction of an HTTP controller. Serves as a one stop shop for obtaining
 * HTTP southbound devices and (un)register listeners.
 */
public interface HttpSBController {

    /**
     * Returns all the devices known to this controller.
     *
     * @return map of devices
     */
    Map<DeviceId, RestSBDevice> getDevices();

    /**
     * Returns a device by node identifier.
     *
     * @param deviceInfo node identifier
     * @return RestSBDevice rest device
     */
    RestSBDevice getDevice(DeviceId deviceInfo);

    /**
     * Returns a device by Ip and Port.
     *
     * @param ip device ip
     * @param port device port
     * @return RestSBDevice rest device
     */
    RestSBDevice getDevice(IpAddress ip, int port);

    /**
     * Adds a device to the device map.
     *
     * @param device to be added
     */
    void addDevice(RestSBDevice device);

    /**
     * Removes the device from the devices map.
     *
     * @param deviceId to be removed
     */
    void removeDevice(DeviceId deviceId);

    /**
     * Does a HTTP POST request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return true if operation returned 200, 201, 202, false otherwise
     *
     * @deprecated in Kingfisher (1.10.0)
     */
    @Deprecated
    boolean post(DeviceId device, String request, InputStream payload, String mediaType);

    /**
     * Does a HTTP POST request with specified parameters to the device.
     *
     * @param <T> post return type
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @param responseClass the type of response object we are interested in,
     *            such as String, InputStream.
     * @return Object of type requested via responseClass.
     */
    @Deprecated
    <T> T post(DeviceId device, String request, InputStream payload, String mediaType, Class<T> responseClass);

    /**
     * Does a HTTP PUT request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request resource path of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return true if operation returned 200, 201, 202, false otherwise
     *
     * @deprecated in Kingfisher (1.10.0)
     */
    @Deprecated
    boolean put(DeviceId device, String request, InputStream payload, String mediaType);

    /**
     *
     * Does a HTTP GET request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param mediaType format to retrieve the content in
     * @return an inputstream of data from the reply.
     */
    @Deprecated
    InputStream get(DeviceId device, String request, String mediaType);

    /**
     * Does a HTTP PATCH request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType format to retrieve the content in
     * @return true if operation returned 200, 201, 202, false otherwise
     *
     * @deprecated in Kingfisher (1.10.0)
     */
    @Deprecated
    boolean patch(DeviceId device, String request, InputStream payload, String mediaType);

    /**
     * Does a HTTP DELETE request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return true if operation returned 200 false otherwise
     *
     * @deprecated in Kingfisher (1.10.0)
     */
    @Deprecated
    boolean delete(DeviceId device, String request, InputStream payload, String mediaType);

    /**
     * Does a HTTP POST request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return status Commonly used status codes defined by HTTP
     */
    int post(DeviceId device, String request, InputStream payload, MediaType mediaType);

    /**
     * Does a HTTP PUT request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request resource path of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return status Commonly used status codes defined by HTTP
     */
    int put(DeviceId device, String request, InputStream payload, MediaType mediaType);

    /**
     * Does a HTTP PATCH request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType format to retrieve the content in
     * @return status Commonly used status codes defined by HTTP
     */
    int patch(DeviceId device, String request, InputStream payload, MediaType mediaType);

    /**
     * Does a HTTP DELETE request with specified parameters to the device.
     *
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @return status Commonly used status codes defined by HTTP
     */
    int delete(DeviceId device, String request, InputStream payload, MediaType mediaType);

    /**
    *
    * Does a HTTP GET request with specified parameters to the device.
    *
    * @param device device to make the request to
    * @param request url of the request
    * @param mediaType format to retrieve the content in
    * @return an inputstream of data from the reply.
    */
    InputStream get(DeviceId device, String request, MediaType mediaType);

    /**
     * Does a HTTP POST request with specified parameters to the device.
     *
     * @param <T> post return type
     * @param device device to make the request to
     * @param request url of the request
     * @param payload payload of the request as an InputStream
     * @param mediaType type of content in the payload i.e. application/json
     * @param responseClass the type of response object we are interested in,
     *            such as String, InputStream.
     * @return Object of type requested via responseClass.
     */
     <T> T post(DeviceId device, String request, InputStream payload, MediaType mediaType, Class<T> responseClass);


}
