/*
 * Copyright 2015 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.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 TE Object.
 */
public interface PcepTEObject {

    /**
     * Returns TE object header.
     *
     * @return TE object header
     */
    PcepObjectHeader getTEObjHeader();

    /**
     * Sets TE Object header.
     *
     * @param obj TE Object header
     */
    void setTEObjHeader(PcepObjectHeader obj);

    /**
     * Returns ProtocolId in TE Object.
     *
     * @return ProtocolId in TE Object
     */
    byte getProtocolId();

    /**
     * Sets ProtocolId in TE Object.
     *
     * @param yProtId ProtocolId in TE Object
     */
    void setProtocolId(byte yProtId);

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

    /**
     * Sets R flag in TE Object.
     *
     * @param bRFlag R flag in TE Object
     */
    void setRFlag(boolean bRFlag);

    /**
     * Returns S flag in TE Object.
     *
     * @return S flag in TE Object
     */
    boolean getSFlag();

    /**
     * Sets S flag in TE Object.
     *
     * @param bSFlag S flag in TE Object
     */
    void setSFlag(boolean bSFlag);

    /**
     * Returns TE ID in TE Object.
     *
     * @return TE ID in TE Object
     */
    int getTEId();

    /**
     * Sets TE ID in TE Object.
     *
     * @param iTEId TE ID in TE Object
     */
    void setTEId(int iTEId);

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

    /**
     * Sets list of Optional Tlvs in TE Object.
     *
     * @param llOptionalTlv list of Optional Tlvs
     */
    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);

    /**
     * Prints attributes of TE object.
     */
    void print();

    /**
     * Writes the TE Object into channel buffer.
     *
     * @param bb channel buffer
     * @return Returns the writerIndex of this buffer
     * @throws PcepParseException when obj header is not written to channel buffer
     */
    int write(ChannelBuffer bb) throws PcepParseException;

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

        /**
         * Builds TE Object.
         *
         * @return TE Object
         */
        PcepTEObject build();

        /**
         * Returns TE object header.
         *
         * @return TE object header
         */
        PcepObjectHeader getTEObjHeader();

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

        /**
         * Returns ProtocolId in TE Object.
         *
         * @return ProtocolId in TE Object
         */
        byte getProtocolId();

        /**
         * Sets ProtocolId in TE Object and returns its builder.
         *
         * @param yProtId ProtocolId in TE Object
         * @return Builder by setting ProtocolId
         */
        Builder setProtocolId(byte yProtId);

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

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

        /**
         * Returns S flag in TE Object.
         *
         * @return S flag in TE Object
         */
        boolean getSFlag();

        /**
         * Sets S flag in TE Object and returns its builder.
         *
         * @param bSFlag S flag in TE Object
         * @return Builder by setting S flag
         */
        Builder setSFlag(boolean bSFlag);

        /**
         * Returns TE ID in TE Object.
         *
         * @return TE ID in TE Object
         */
        int getTEId();

        /**
         * Sets TE ID in TE Object and returns its builder.
         *
         * @param iTEId TE ID in TE Object
         * @return Builder by setting TE ID
         */
        Builder setTEId(int iTEId);

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

        /**
         * Sets list of Optional Tlvs in TE Object 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 TE 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 TE object header and returns its builder.
         *
         * @param value boolean value to set I flag
         * @return Builder by setting I flag
         */
        Builder setIFlag(boolean value);
    }
}
