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

import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.net.flowobjective.Objective;

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

/**
 * Objective Codec Helper.
 */
public class ObjectiveCodecHelper {

    // JSON field names
    private static final String ID = "id";
    private static final String APP_ID = "appId";
    private static final String OPERATION = "operation";
    private static final String PERMANENT = "isPermanent";
    private static final String PRIORITY = "priority";
    private static final String TIMEOUT = "timeout";
    public static final String REST_APP_ID = "org.onosproject.rest";

    public ObjectNode encode(Objective objective, CodecContext context) {
        checkNotNull(objective, "Objective cannot be null");

        ObjectNode result = context.mapper().createObjectNode()
                .put(ID, objective.id())
                .put(OPERATION, objective.op().toString())
                .put(PERMANENT, String.valueOf(objective.permanent()))
                .put(PRIORITY, objective.priority())
                .put(TIMEOUT, objective.timeout());

        if (objective.appId() != null) {
            result.put(APP_ID, objective.appId().toString());
        }

        return result;
    }

    public Objective.Builder decode(ObjectNode json, Objective.Builder builder, CodecContext context) {
        if (json == null || !json.isObject()) {
            return null;
        }

        // permanent
        boolean permanent = false;
        if (json.get(PERMANENT) != null) {
            permanent = json.get(PERMANENT).asBoolean();
        }

        // timeout
        int timeoutInt = 0;
        if (json.get(TIMEOUT) != null) {
            timeoutInt = json.get(TIMEOUT).asInt();
        }

        // priority
        int priorityInt = 0;
        if (json.get(PRIORITY) != null) {
            priorityInt = json.get(PRIORITY).asInt();
        }

        if (permanent) {
            builder.makePermanent()
                    .makeTemporary(timeoutInt)
                    .withPriority(priorityInt);
        } else {
            builder.makeTemporary(timeoutInt)
                    .withPriority(priorityInt);
        }
        return builder;
    }
}
