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

import java.util.Objects;

import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.bgpio.util.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.MoreObjects;

/**
 * Provides implementation of BGP route policy distribution capability tlv.
 */
public class RpdCapabilityTlv implements BgpValueType {

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

    public static final byte TYPE = (byte) 129;
    public static final byte LENGTH = 4;
    private short afi = Constants.AFI_FLOWSPEC_RPD_VALUE;
    private byte sAfi = Constants.SAFI_FLOWSPEC_RPD_VALUE;

    private final byte sendReceive;

    /**
     * Creates instance of route policy distribution capability.
     * @param sendReceive value indicate wherether flow route is only for receive or send or both.
     */
    public RpdCapabilityTlv(byte sendReceive) {
        this.sendReceive = sendReceive;
    }

    /**
     * Creates instance of RpdCapabilityTlv.
     * @param sendReceive value indicate wherether flow route is only for receive or send or both.
     * @return object of RpdCapabilityTlv
     */
    public static RpdCapabilityTlv of(final byte sendReceive) {
        return new RpdCapabilityTlv(sendReceive);
    }

    /**
     * Returns value of send receive field of route policy distribution capability.
     * @return send receive value of route policy distribution capability
     */
    public byte sendReceive() {
        return sendReceive;
    }

    @Override
    public short getType() {
        return TYPE;
    }

    @Override
    public int hashCode() {
        return Objects.hash(sendReceive);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof RpdCapabilityTlv) {
            RpdCapabilityTlv other = (RpdCapabilityTlv) obj;
            return Objects.equals(sendReceive, other.sendReceive);
        }
        return false;
    }

    @Override
    public int write(ChannelBuffer cb) {
        int iLenStartIndex = cb.writerIndex();
        cb.writeByte(TYPE);
        cb.writeByte(LENGTH);
        cb.writeShort(afi);
        cb.writeByte(sAfi);
        cb.writeByte(sendReceive);
        return cb.writerIndex() - iLenStartIndex;
    }

    /**
     * Reads the channel buffer and returns object of RpdCapabilityTlv.
     * @param cb type of channel buffer
     * @return object of RpdCapabilityTlv
     */
    public static RpdCapabilityTlv read(ChannelBuffer cb) {
        short afi = cb.readShort();
        byte sAfi = cb.readByte();
        return RpdCapabilityTlv.of(cb.readByte());
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .add("Type", TYPE)
                .add("Length", LENGTH)
                .add("afi", afi)
                .add("safi", sAfi)
                .add("sendReceive", sendReceive).toString();
    }

    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }
}
