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