/*
 * Copyright 2015 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.ui.impl;

import org.glassfish.jersey.media.multipart.FormDataParam;
import org.onlab.rest.BaseResource;
import org.onosproject.app.ApplicationAdminService;
import org.onosproject.core.Application;
import org.onosproject.core.ApplicationId;

import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
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.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;

/**
 * Application upload resource.
 */
@Path("applications")
public class ApplicationResource extends BaseResource {

    static String lastInstalledAppName = null;


    @Path("upload")
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response upload(@QueryParam("activate") @DefaultValue("false") String activate,
                           @FormDataParam("file") InputStream stream) throws IOException {
        ApplicationAdminService service = get(ApplicationAdminService.class);
        Application app = service.install(stream);
        lastInstalledAppName = app.id().name();
        if (Objects.equals(activate, "true")) {
            service.activate(app.id());
        }
        return Response.ok().build();
    }

    @Path("{name}/icon")
    @GET
    @Produces("image/png")
    public Response getIcon(@PathParam("name") String name) throws IOException {
        ApplicationAdminService service = get(ApplicationAdminService.class);
        ApplicationId appId = service.getId(name);
        Application app = service.getApplication(appId);
        return Response.ok(app.icon()).build();
    }
}
