/*
 * 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.openstacknetworking.web;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.openstacknetworking.OpenstackNetwork;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Implementation of the OpenstackNetwork Codec.
 *
 */
public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> {

    private final Logger log = LoggerFactory.getLogger(getClass());

    private static final String NETWORK = "network";
    private static final String NAME = "name";
    private static final String TENANT_ID = "tenant_id";
    private static final String SEGMENTATION_ID = "provider:segmentation_id";
    private static final String NETWORK_TYPE = "provider:network_type";
    private static final String ID = "id";

    @Override
    public OpenstackNetwork decode(ObjectNode json, CodecContext context) {

        JsonNode networkInfo = json.get(NETWORK);
        if (networkInfo == null) {
            networkInfo = json;
        }

        String name = networkInfo.path(NAME).asText();
        String tenantId = networkInfo.path(TENANT_ID).asText();
        String id = networkInfo.path(ID).asText();

        OpenstackNetwork.Builder onb = OpenstackNetwork.builder();
        onb.name(name)
                .tenantId(tenantId)
                .id(id);

        if (networkInfo.path(NETWORK_TYPE).isMissingNode()) {
            log.debug("Network {} has no network type, ignore it.", name);
            return null;
        }

        String networkType = networkInfo.path(NETWORK_TYPE).asText();
        try {
            onb.networkType(OpenstackNetwork.NetworkType.valueOf(networkType.toUpperCase()));
        } catch (IllegalArgumentException e) {
            log.debug("Network {} has unsupported network type {}, ignore it.",
                     name, networkType);
            return null;
        }

        onb.segmentId(networkInfo.path(SEGMENTATION_ID).asText());

        return onb.build();
    }
}
