/*
 * Copyright 2016 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.openstackinterface.web;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.openstackinterface.OpenstackSecurityGroup;
import org.onosproject.openstackinterface.OpenstackSecurityGroupRule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 * Encodes and decodes the Openstack Security Group.
 */
public class OpenstackSecurityGroupCodec extends JsonCodec<OpenstackSecurityGroup> {

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

    private static final String SECURITY_GROUP = "security_group";
    private static final String DESCRIPTION = "description";
    private static final String ID = "id";
    private static final String NAME = "name";
    private static final String SECURITY_GROUP_RULES = "security_group_rules";
    private static final String DIRECTION = "direction";
    private static final String EHTERTYPE = "ethertype";
    private static final String PORT_RANGE_MAX = "port_range_max";
    private static final String PORT_RANGE_MIN = "port_range_min";
    private static final String PROTOCOL = "protocol";
    private static final String REMOTE_GROUP_ID = "remote_group_id";
    private static final String REMOTE_IP_PREFIX = "remote_ip_prefix";
    private static final String SECURITY_GROUP_ID = "security_group_id";
    private static final String TENANT_ID = "tenant_id";

    @Override
    public OpenstackSecurityGroup decode(ObjectNode json, CodecContext context) {
        JsonNode securityGroupNode = json.get(SECURITY_GROUP);
        if (securityGroupNode == null) {
            log.warn("SecurityGroup Json data is null");
            return null;
        }

        String description = securityGroupNode.path(DESCRIPTION).asText();
        String id = securityGroupNode.path(ID).asText();
        String name = securityGroupNode.path(NAME).asText();
        ArrayNode ruleInfoList = (ArrayNode) securityGroupNode.path(SECURITY_GROUP_RULES);
        Collection<OpenstackSecurityGroupRule> rules = Lists.newArrayList();
        for (JsonNode ruleInfo: ruleInfoList) {
            OpenstackSecurityGroupRule openstackSecurityGroupRule =
                    new OpenstackSecurityGroupRule.Builder()
                        .direction(ruleInfo.path(DIRECTION).asText())
                        .etherType(ruleInfo.path(EHTERTYPE).asText())
                        .id(ruleInfo.path(ID).asText())
                        .portRangeMax(ruleInfo.path(PORT_RANGE_MAX).asText())
                        .portRangeMin(ruleInfo.path(PORT_RANGE_MIN).asText())
                        .protocol(ruleInfo.path(PROTOCOL).asText())
                        .remoteGroupId(ruleInfo.path(REMOTE_GROUP_ID).asText())
                        .remoteIpPrefix(ruleInfo.path(REMOTE_IP_PREFIX).asText())
                        .securityGroupId(ruleInfo.path(SECURITY_GROUP_ID).asText())
                        .tenantId(ruleInfo.path(TENANT_ID).asText())
                        .build();

            rules.add(openstackSecurityGroupRule);
        }
        String tenantId = securityGroupNode.path(TENANT_ID).asText();

        OpenstackSecurityGroup openstackSecurityGroup = OpenstackSecurityGroup.builder()
                .description(description)
                .id(id)
                .name(name)
                .rules(rules)
                .tenantId(tenantId)
                .build();

        return openstackSecurityGroup;
    }
}
