/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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.pcepio.protocol;

import java.util.LinkedList;

import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;

/**
 * Abstraction of an entity providing PCEP RP Object.
 */
public interface PcepRPObject {

    /**
     * Returns RequestId Number in RP Object.
     *
     * @return RequestId Number in RP Object
     */
    int getRequestIdNum();

    /**
     * Sets RequestId Number with specified value.
     *
     * @param value RequestId Number
     */
    void setRequestIdNum(int value);

    /**
     * Returns O flag in RP Object.
     *
     * @return O flag in RP Object
     */
    boolean getOFlag();

    /**
     * Sets O flag with specified value.
     *
     * @param value O flag
     */
    void setOFlag(boolean value);

    /**
     * Returns B flag in RP Object.
     *
     * @return B flag in RP Object
     */
    boolean getBFlag();

    /**
     * Sets B flag with specified value.
     *
     * @param value B flag
     */
    void setBFlag(boolean value);

    /**
     * Returns R flag in RP Object.
     *
     * @return R flag in RP Object
     */
    boolean getRFlag();

    /**
     * Sets R flag with specified value.
     *
     * @param value R flag
     */
    void setRFlag(boolean value);

    /**
     * Returns Priority Flag in RP Object.
     *
     * @return Priority Flag in RP Object
     */
    byte getPriFlag();

    /**
     * Sets Priority Flag with specified value.
     *
     * @param value Priority Flag
     */
    void setPriFlag(byte value);

    /**
     * Returns list of Optional Tlvs in RP Object.
     *
     * @return list of Optional Tlvs in RP Object
     */
    LinkedList<PcepValueType> getOptionalTlv();

    /**
     * Sets list of Optional Tlvs in RP Object and returns its builder.
     *
     * @param llOptionalTlv list of Optional Tlvs
     */
    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);

    /**
     * Writes the RP Object into channel buffer.
     *
     * @param bb channel buffer
     * @return Returns the writerIndex of this buffer
     * @throws PcepParseException while writing RP object into Channel Buffer.
     */
    int write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Builder interface with get and set functions to build bandwidth object.
     */
    interface Builder {

        /**
         * Builds RP Object.
         *
         * @return RP Object
         */
        PcepRPObject build();

        /**
         * Returns RP object header.
         *
         * @return RP object header
         */
        PcepObjectHeader getRPObjHeader();

        /**
         * Sets RP object header and returns its builder.
         *
         * @param obj RP object header
         * @return Builder by setting RP object header
         */
        Builder setRPObjHeader(PcepObjectHeader obj);

        /**
         * Returns Request Id Number in RP Object.
         *
         * @return Request Id Number in RP Object
         */
        int getRequestIdNum();

        /**
         * Sets Request Id Number and returns its builder.
         *
         * @param value Request Id Number
         * @return Builder by setting Request Id Number
         */
        Builder setRequestIdNum(int value);

        /**
         * Returns O flag in RP Object.
         *
         * @return O flag in RP Object
         */
        boolean getOFlag();

        /**
         * Sets O flag and returns its builder.
         *
         * @param value O flag
         * @return Builder by setting O flag
         */
        Builder setOFlag(boolean value);

        /**
         * Returns B flag in RP Object.
         *
         * @return B flag in RP Object
         */
        boolean getBFlag();

        /**
         * Sets B flag and returns its builder.
         *
         * @param value B flag
         * @return Builder by setting B flag
         */
        Builder setBFlag(boolean value);

        /**
         * Returns R flag in RP Object.
         *
         * @return R flag in RP Object
         */
        boolean getRFlag();

        /**
         * Sets R flag and returns its builder.
         *
         * @param value R flag
         * @return Builder by setting R flag
         */
        Builder setRFlag(boolean value);

        /**
         * Returns Priority Flag in RP Object.
         *
         * @return Priority Flag in RP Object
         */
        byte getPriFlag();

        /**
         * Sets Priority Flag and returns its builder.
         *
         * @param value Priority Flag
         * @return Builder by setting Priority Flag
         */
        Builder setPriFlag(byte value);

        /**
         * Returns list of Optional Tlvs in RP Object.
         *
         * @return list of Optional Tlvs
         */
        LinkedList<PcepValueType> getOptionalTlv();

        /**
         * Sets list of Optional Tlvs and returns its builder.
         *
         * @param llOptionalTlv list of Optional Tlvs
         * @return Builder by setting list of Optional Tlvs
         */
        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);

        /**
         * Sets P flag in RP object header and returns its builder.
         *
         * @param value boolean value to set P flag
         * @return Builder by setting P flag
         */
        Builder setPFlag(boolean value);

        /**
         * Sets I flag in RP object header and returns its builder.
         *
         * @param value boolean value to set I flag
         * @return Builder by setting I flag
         */
        Builder setIFlag(boolean value);
    }
}
