/*
 * 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.codec.impl;

import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang3.StringEscapeUtils;
import org.onosproject.app.ApplicationService;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.Application;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Application JSON codec.
 */
public final class ApplicationCodec extends JsonCodec<Application> {

    @Override
    public ObjectNode encode(Application app, CodecContext context) {
        checkNotNull(app, "Application cannot be null");
        ApplicationService service = context.getService(ApplicationService.class);

        ArrayNode permissions = context.mapper().createArrayNode();
        ArrayNode features = context.mapper().createArrayNode();
        ArrayNode requiredApps = context.mapper().createArrayNode();

        app.permissions().forEach(p -> permissions.add(p.toString()));
        app.features().forEach(f -> features.add(f));
        app.requiredApps().forEach(a -> requiredApps.add(a));

        ObjectNode result = context.mapper().createObjectNode()
                .put("name", app.id().name())
                .put("id", app.id().id())
                .put("version", app.version().toString())
                .put("category", app.category())
                .put("description", StringEscapeUtils.escapeJson(app.description()))
                .put("readme", StringEscapeUtils.escapeJson(app.readme()))
                .put("origin", app.origin())
                .put("url", app.url())
                .put("featuresRepo", app.featuresRepo().isPresent() ?
                        app.featuresRepo().get().toString() : "")
                .put("state", service.getState(app.id()).toString());

        result.set("features", features);
        result.set("permissions", permissions);
        result.set("requiredApps", requiredApps);

        return result;
    }
}
