/*
 * Copyright 2021-present Open Networking Foundation
 *
 * 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.kubevirtnetworking.codec;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onlab.packet.IpAddress;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.kubevirtnetworking.api.DefaultKubevirtFloatingIp;
import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
import org.slf4j.Logger;

import static com.google.common.base.Preconditions.checkNotNull;
import static org.onlab.util.Tools.nullIsIllegal;
import static org.slf4j.LoggerFactory.getLogger;

/**
 * Kubevirt floating IP codec used for serializing and de-serializing JSON string.
 */
public final class KubevirtFloatingIpCodec extends JsonCodec<KubevirtFloatingIp> {

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

    private static final String ID = "id";
    private static final String ROUTER_NAME = "routerName";
    private static final String POD_NAME = "podName";
    private static final String FLOATING_IP = "floatingIp";
    private static final String FIXED_IP = "fixedIp";

    private static final String MISSING_MESSAGE = " is required in KubevirtFloatingIp";

    @Override
    public ObjectNode encode(KubevirtFloatingIp fip, CodecContext context) {
        checkNotNull(fip, "Kubevirt floating IP cannot be null");

        ObjectNode result = context.mapper().createObjectNode()
                .put(ID, fip.id())
                .put(ROUTER_NAME, fip.routerName())
                .put(FLOATING_IP, fip.floatingIp().toString());

        if (fip.podName() != null) {
            result.put(POD_NAME, fip.podName());
        }

        if (fip.fixedIp() != null) {
            result.put(FIXED_IP, fip.fixedIp().toString());
        }

        return result;
    }

    @Override
    public KubevirtFloatingIp decode(ObjectNode json, CodecContext context) {
        if (json == null || !json.isObject()) {
            return null;
        }

        String id = nullIsIllegal(json.get(ID).asText(), ID + MISSING_MESSAGE);
        String routerName = nullIsIllegal(json.get(ROUTER_NAME).asText(),
                ROUTER_NAME + MISSING_MESSAGE);
        String floatingIp = nullIsIllegal(json.get(FLOATING_IP).asText(),
                FLOATING_IP + MISSING_MESSAGE);

        KubevirtFloatingIp.Builder builder = DefaultKubevirtFloatingIp.builder()
                .id(id)
                .routerName(routerName)
                .floatingIp(IpAddress.valueOf(floatingIp));

        JsonNode podName = json.get(POD_NAME);
        if (podName != null) {
            builder.podName(podName.asText());
        }

        JsonNode fixedIp = json.get(FIXED_IP);
        if (fixedIp != null) {
            builder.fixedIp(IpAddress.valueOf(fixedIp.asText()));
        }

        return builder.build();
    }
}
