/*
 * Copyright 2015-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.onlab.packet.ChassisId;
import org.onosproject.codec.CodecContext;
import org.onosproject.net.Annotations;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.DefaultDevice;
import org.onosproject.net.DefaultPort;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Port;
import org.onosproject.net.Port.Type;
import org.onosproject.net.PortNumber;
import org.onosproject.net.provider.ProviderId;

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

/**
 * Device port JSON codec.
 */
public final class PortCodec extends AnnotatedCodec<Port> {

    // JSON field names
    private static final String ELEMENT = "element"; // DeviceId
    private static final String PORT_NAME = "port";
    private static final String IS_ENABLED = "isEnabled";
    private static final String TYPE = "type";
    private static final String PORT_SPEED = "portSpeed";

    // Special port name alias
    private static final String PORT_NAME_LOCAL = "local";

    @Override
    public ObjectNode encode(Port port, CodecContext context) {
        checkNotNull(port, "Port cannot be null");
        ObjectNode result = context.mapper().createObjectNode()
                .put(ELEMENT, port.element().id().toString())
                .put(PORT_NAME, portName(port.number()))
                .put(IS_ENABLED, port.isEnabled())
                .put(TYPE, port.type().toString().toLowerCase())
                .put(PORT_SPEED, port.portSpeed());
        return annotate(result, port, context);
    }

    private String portName(PortNumber port) {
        return port.equals(PortNumber.LOCAL) ? PORT_NAME_LOCAL : port.toString();
    }

    private static PortNumber portNumber(String portName) {
        if (portName.equalsIgnoreCase(PORT_NAME_LOCAL)) {
            return PortNumber.LOCAL;
        }

        return PortNumber.portNumber(portName);
    }


    /**
     * {@inheritDoc}
     *
     * Note: Result of {@link Port#element()} returned Port object,
     *       is not a full Device object.
     *       Only it's DeviceId can be used.
     */
    @Override
    public Port decode(ObjectNode json, CodecContext context) {
        if (json == null || !json.isObject()) {
            return null;
        }

        DeviceId did = DeviceId.deviceId(json.get(ELEMENT).asText());
        Device device = new DummyDevice(did);
        PortNumber number = portNumber(json.get(PORT_NAME).asText());
        boolean isEnabled = json.get(IS_ENABLED).asBoolean();
        Type type = Type.valueOf(json.get(TYPE).asText().toUpperCase());
        long portSpeed = json.get(PORT_SPEED).asLong();
        Annotations annotations = extractAnnotations(json, context);

        return new DefaultPort(device, number, isEnabled, type, portSpeed, annotations);
    }


    /**
     * Dummy Device which only holds DeviceId.
     */
    private static final class DummyDevice extends DefaultDevice {
        /**
         * Constructs Dummy Device which only holds DeviceId.
         *
         * @param did device Id
         */
        public DummyDevice(DeviceId did) {
            super(new ProviderId(did.uri().getScheme(), "PortCodec"), did,
                  Type.SWITCH, "dummy", "0", "0", "0", new ChassisId(),
                  DefaultAnnotations.EMPTY);
        }
    }
}
