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


    /**
     * Constructor.
     */
    OspfMessageEncoder() {
    }

    /**
     * Constructor to initialize 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;
    }
}