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

import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.net.key.DeviceKey;
import org.onosproject.net.key.DeviceKeyAdminService;
import org.onosproject.net.key.DeviceKeyId;
import org.onosproject.net.key.DeviceKeyService;
import org.onosproject.rest.AbstractWebResource;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.io.InputStream;

import static org.onlab.util.Tools.nullIsNotFound;

/**
 * Query and Manage Device Keys.
 */
@Path("keys")
public class DeviceKeyWebResource extends AbstractWebResource {

    @Context
    UriInfo uriInfo;

    private static final String DEVICE_KEY_NOT_FOUND = "Device key was not found";

    /**
     * Gets all device keys.
     * Returns array of all device keys.
     *
     * @return 200 OK
     * @onos.rsModel Devicekeys
     */
    @GET
    public Response getDeviceKeys() {
        Iterable<DeviceKey> deviceKeys = get(DeviceKeyService.class).getDeviceKeys();
        return ok(encodeArray(DeviceKey.class, "keys", deviceKeys)).build();
    }

    /**
     * Get a single device key by device key unique identifier.
     * Returns the specified device key.
     *
     * @param id device key identifier
     * @return 200 OK, 404 not found
     * @onos.rsModel Devicekey
     */
    @GET
    @Path("{id}")
    public Response getDeviceKey(@PathParam("id") String id) {
        DeviceKey deviceKey = nullIsNotFound(get(DeviceKeyService.class).getDeviceKey(DeviceKeyId.deviceKeyId(id)),
                                             DEVICE_KEY_NOT_FOUND);
        return ok(codec(DeviceKey.class).encode(deviceKey, this)).build();
    }

    /**
     * Adds a new device key from the JSON input stream.
     *
     * @param stream device key JSON stream
     * @return status of the request - CREATED if the JSON is correct,
     * BAD_REQUEST if the JSON is invalid
     * @onos.rsModel Devicekey
     */
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response addDeviceKey(InputStream stream) {
        try {
            DeviceKeyAdminService service = get(DeviceKeyAdminService.class);
            ObjectNode root = (ObjectNode) mapper().readTree(stream);
            DeviceKey deviceKey = codec(DeviceKey.class).decode(root, this);
            service.addKey(deviceKey);

            UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
                    .path("keys")
                    .path(deviceKey.deviceKeyId().id());

            return Response
                    .created(locationBuilder.build())
                    .build();

        } catch (IOException ioe) {
            throw new IllegalArgumentException(ioe);
        }
    }

    /**
     * Removes a device key by device key identifier.
     *
     * @param id device key identifier
     * @return 200 OK, 404 not found
     */
    @DELETE
    @Path("{id}")
    public Response removeDeviceKey(@PathParam("id") String id) {
        DeviceKey deviceKey = nullIsNotFound(get(DeviceKeyService.class).getDeviceKey(DeviceKeyId.deviceKeyId(id)),
                                             DEVICE_KEY_NOT_FOUND);
        get(DeviceKeyAdminService.class).removeKey(DeviceKeyId.deviceKeyId(id));
        return ok(codec(DeviceKey.class).encode(deviceKey, this)).build();
    }
}
