/*
 * Copyright 2015-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.cord.gui;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

/**
 * Web resource to use as the GUI back-end and as a proxy to XOS REST API.
 */
@Path("")
public class CordWebResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("login/{email}")
    public Response login(@PathParam("email") String email) {
        return Response.ok(CordModelCache.INSTANCE.jsonLogin(email)).build();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("dashboard")
    public Response dashboard() {
        return Response.ok(CordModelCache.INSTANCE.jsonDashboard()).build();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("bundle")
    public Response bundle() {
        return Response.ok(CordModelCache.INSTANCE.jsonBundle()).build();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("users")
    public Response users() {
        return Response.ok(CordModelCache.INSTANCE.jsonUsers()).build();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("logout")
    public Response logout() {
        return Response.ok(CordModelCache.INSTANCE.jsonLogout()).build();
    }

    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("bundle/{id}")
    public Response bundle(@PathParam("id") String bundleId) {
        CordModelCache.INSTANCE.setCurrentBundle(bundleId);
        return bundle();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("users/{id}/apply/{func}/{param}/{value}")
    public Response bundle(@PathParam("id") String userId,
                           @PathParam("func") String funcId,
                           @PathParam("param") String param,
                           @PathParam("value") String value) {
        CordModelCache.INSTANCE.applyPerUserParam(userId, funcId, param, value);
        return users();
    }
}
