package net.onrc.onos.core.intent.runtime.web;

import java.util.Arrays;
import java.util.List;

import net.onrc.onos.api.rest.RestError;
import net.onrc.onos.api.rest.RestErrorCodes;
import net.onrc.onos.core.intent.Intent;
import net.onrc.onos.core.intent.IntentMap;
import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;

import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;

/**
 * A class to access a single high-level intent.
 */
public class IntentHighObjectResource extends ServerResource {
    // TODO need to assign proper application id.
    private static final String APPLICATION_ID = "1";

    /**
     * Gets a single high-level intent.
     *
     * @return a Representation of a single high-level intent. If the
     * intent is not found, return a Representation of a RestError indicating
     * the problem.
     */
    @Get("json")
    public Representation retrieve() {
        IPathCalcRuntimeService pathRuntime =
            (IPathCalcRuntimeService) getContext().getAttributes()
                .get(IPathCalcRuntimeService.class.getCanonicalName());

        String intentId = (String) getRequestAttributes().get("intent-id");
        Representation result;

        //
        // Get a single high-level Intent: use the Intent ID to find it
        //
        IntentMap intentMap = pathRuntime.getHighLevelIntents();
        String applnIntentId = APPLICATION_ID + ":" + intentId;
        Intent intent = intentMap.getIntent(applnIntentId);
        if (intent != null) {
            result = toRepresentation(intent, null);
        } else {
            setStatus(Status.CLIENT_ERROR_NOT_FOUND);
            final RestError notFound =
                RestError.createRestError(RestErrorCodes.RestErrorCode.INTENT_NOT_FOUND,
                                          applnIntentId);
            result = toRepresentation(notFound, null);
        }

        return result;
    }

    /**
     * Deletes a single high-level intent.
     *
     * @return a null Representation.
     */
    @Delete("json")
    public Representation remove() {
        IPathCalcRuntimeService pathRuntime =
            (IPathCalcRuntimeService) getContext().getAttributes()
                .get(IPathCalcRuntimeService.class.getCanonicalName());

        String intentId = (String) getRequestAttributes().get("intent-id");
        List<String> intentIds = Arrays.asList(intentId);

        if (pathRuntime.removeApplicationIntents(APPLICATION_ID, intentIds)) {
            setStatus(Status.SUCCESS_NO_CONTENT);
        } else {
            setStatus(Status.SERVER_ERROR_INTERNAL);
        }

        return null;
    }
}
