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

import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Provides BGP Message Header which is common for all the Messages.
 */

public class BgpHeader {

    /*      0                   1                   2                   3
          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                                                               |
          +                                                               +
          |                                                               |
          +                                                               +
          |                           Marker                              |
          +                                                               +
          |                                                               |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |          Length               |      Type     |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    */

    protected static final Logger log = LoggerFactory.getLogger(BgpHeader.class);

    public static final int MARKER_LENGTH = 16;
    public static final short DEFAULT_HEADER_LENGTH = 19;

    private byte[] marker;
    private byte type;
    private short length;

    /**
     * Reset fields.
     */
    public BgpHeader() {
        this.marker = null;
        this.length = 0;
        this.type = 0;
    }

    /**
     * Constructors to initialize parameters.
     *
     * @param marker field in BGP header
     * @param length message length
     * @param type message type
     */
    public BgpHeader(byte[] marker, short length, byte type) {
        this.marker = marker;
        this.length = length;
        this.type = type;
    }

    /**
     * Sets marker field.
     *
     * @param value marker field
     */
    public void setMarker(byte[] value) {
        this.marker = value;
    }

    /**
     * Sets message type.
     *
     * @param value message type
     */
    public void setType(byte value) {
        this.type = value;
    }

    /**
     * Sets message length.
     *
     * @param value message length
     */
    public void setLength(short value) {
        this.length = value;
    }

    /**
     * Returns message length.
     *
     * @return message length
     */
    public short getLength() {
        return this.length;
    }

    /**
     * Returns message marker.
     *
     * @return message marker
     */
    public byte[] getMarker() {
        return this.marker;
    }

    /**
     * Returns message type.
     *
     * @return message type
     */
    public byte getType() {
        return this.type;
    }

    /**
     * Writes Byte stream of BGP header to channel buffer.
     *
     * @param cb ChannelBuffer
     * @return length index of message header
     */
    public int write(ChannelBuffer cb) {

        cb.writeBytes(getMarker(), 0, MARKER_LENGTH);

        int headerLenIndex = cb.writerIndex();
        cb.writeShort((short) 0);
        cb.writeByte(type);

        return headerLenIndex;
    }

    /**
     * Read from channel buffer and Returns BGP header.
     *
     * @param cb ChannelBuffer
     * @return object of BGPHeader
     */
    public static BgpHeader read(ChannelBuffer cb) {

        byte[] marker = new byte[MARKER_LENGTH];
        byte type;
        short length;
        cb.readBytes(marker, 0, MARKER_LENGTH);
        length = cb.readShort();
        type = cb.readByte();
        return new BgpHeader(marker, length, type);
    }
}