/*
 * 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
     */
    public int write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Builder interface with get and set functions to build TE object.
     */
    public 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);
    }
}