/**
 * 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.kafkaintegration.converter;

import org.onosproject.event.Event;
import org.onosproject.grpc.net.Link.ConnectPoint;
import org.onosproject.grpc.net.Link.LinkCore;
import org.onosproject.grpc.net.Link.LinkState;
import org.onosproject.grpc.net.Link.LinkType;
import org.onosproject.grpc.net.LinkEvent.LinkEventType;
import org.onosproject.grpc.net.LinkEvent.LinkNotification;
import org.onosproject.net.link.LinkEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.protobuf.GeneratedMessageV3;

/**
 * Converts for ONOS Link event message to protobuf format.
 */
public class LinkEventConverter implements EventConverter {

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

    @Override
    public byte[] convertToProtoMessage(Event<?, ?> event) {

        LinkEvent linkEvent = (LinkEvent) event;

        if (!linkEventTypeSupported(linkEvent)) {
            log.error("Unsupported Onos Event {}. There is no matching "
                    + "proto Event type", linkEvent.type().toString());
            return null;
        }

        return ((GeneratedMessageV3) buildDeviceProtoMessage(linkEvent)).toByteArray();
    }

    private boolean linkEventTypeSupported(LinkEvent event) {
        LinkEventType[] kafkaLinkEvents = LinkEventType.values();
        for (LinkEventType linkEventType : kafkaLinkEvents) {
            if (linkEventType.name().equals(event.type().name())) {
                return true;
            }
        }
        return false;
    }

    private LinkNotification buildDeviceProtoMessage(LinkEvent linkEvent) {
        LinkNotification notification = LinkNotification.newBuilder()
                .setLinkEventType(getProtoType(linkEvent))
                .setLink(LinkCore.newBuilder()
                        .setState(LinkState
                                .valueOf(linkEvent.subject().state().name()))
                        .setType(LinkType.valueOf(linkEvent.subject().type().name()))
                        .setDst(ConnectPoint.newBuilder()
                                .setDeviceId(linkEvent.subject().dst()
                                        .deviceId().toString())
                                .setPortNumber(linkEvent.subject().dst().port()
                                        .toString()))
                        .setSrc(ConnectPoint.newBuilder()
                                .setDeviceId(linkEvent.subject().src()
                                        .deviceId().toString())
                                .setPortNumber(linkEvent.subject().src().port()
                                        .toString())))
                .build();

        return notification;
    }

    /**
     * Returns the specific Kafka Device Event Type for the corresponding ONOS
     * Device Event Type.
     *
     * @param event ONOS Device Event
     * @return Kafka Device Event Type
     */
    private LinkEventType getProtoType(LinkEvent event) {
        LinkEventType generatedEventType = null;
        LinkEventType[] kafkaEvents = LinkEventType.values();
        for (LinkEventType linkEventType : kafkaEvents) {
            if (linkEventType.name().equals(event.type().name())) {
                generatedEventType = linkEventType;
            }
        }

        return generatedEventType;
    }
}
