/*
 * 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.ospf.controller.impl;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
import org.onosproject.ospf.controller.OspfInterface;
import org.onosproject.ospf.controller.area.OspfInterfaceImpl;
import org.onosproject.ospf.protocol.ospfpacket.OspfMessage;
import org.onosproject.ospf.protocol.ospfpacket.OspfMessageWriter;
import org.onosproject.ospf.protocol.util.OspfInterfaceState;
import org.onosproject.ospf.protocol.util.OspfUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Encodes an OSPF message for output into a ChannelBuffer, for use in a netty pipeline.
 */
public class OspfMessageEncoder extends OneToOneEncoder {

    private static final Logger log = LoggerFactory.getLogger(OspfMessageEncoder.class);
    private OspfInterface ospfInterface;


    /**
     * Creates an instance of OSPF message encoder.
     */
    OspfMessageEncoder() {
    }

    /**
     * Creates an instance of OSPF message encoder.
     *
     * @param ospfInterface OSPF interface instance
     */
    OspfMessageEncoder(OspfInterface ospfInterface) {
        this.ospfInterface = ospfInterface;
    }

    @Override
    protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {

        log.debug("Encoding ospfMessage...!!!");
        if (!(msg instanceof OspfMessage)) {
            log.debug("Invalid msg.");
            return msg;
        }

        OspfMessage ospfMessage = (OspfMessage) msg;
        OspfMessageWriter messageWriter = new OspfMessageWriter();
        if (((OspfInterfaceImpl) ospfInterface).state().equals(OspfInterfaceState.POINT2POINT)) {
            ospfMessage.setDestinationIp(OspfUtil.ALL_SPF_ROUTERS);
        }
        ChannelBuffer buf = messageWriter.writeToBuffer(ospfMessage,
                                                        ((OspfInterfaceImpl) ospfInterface).state().value(),
                                                        ospfInterface.interfaceType());
        log.info("OspfMessageEncoder sending packet of lenght {}", buf.readableBytes());
        log.debug("OspfMessageEncoder sending packet of lenght {}", buf.readableBytes());
        log.debug("Sending {} Message to {}, Length :: {}, <=> {}", ospfMessage.ospfMessageType(),
                  ospfMessage.destinationIp(), buf.readableBytes(), buf.array());

        return buf;
    }
}
