/*
 * 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.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.RoleInfo;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

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

/**
 * Codec for role info.
 */
public final class RoleInfoCodec extends JsonCodec<RoleInfo> {

    // JSON field names
    private static final String MASTER = "master";
    private static final String BACKUPS = "backups";

    private static final String MISSING_MEMBER_MESSAGE = " member is required in RoleInfo";

    @Override
    public ObjectNode encode(RoleInfo roleInfo, CodecContext context) {
        checkNotNull(roleInfo, "RoleInfo cannot be null");

        ObjectNode result = context.mapper().createObjectNode();

        if (roleInfo.master() != null) {
            result.put(MASTER, roleInfo.master().id());
        }

        ArrayNode backups = context.mapper().createArrayNode();
        roleInfo.backups().forEach(backup -> backups.add(backup.id()));

        if (roleInfo.backups().size() != 0) {
            result.set(BACKUPS, backups);
        }

        return result;
    }

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

        // parse node identifier of master
        NodeId nodeId = json.get(MASTER) == null ?
                null : NodeId.nodeId(json.get(MASTER).asText());

        // parse node identifier of backups
        List<NodeId> backups = new ArrayList<>();

        ArrayNode backupsJson = (ArrayNode) nullIsIllegal(json.get(BACKUPS),
                BACKUPS + MISSING_MEMBER_MESSAGE);

        IntStream.range(0, backupsJson.size()).forEach(i -> {
            JsonNode backupJson = nullIsIllegal(backupsJson.get(i),
                    "Backup node id cannot be null");
            backups.add(NodeId.nodeId(backupJson.asText()));
        });

        return new RoleInfo(nodeId, backups);
    }
}
