/*
 * 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 Label Object.
 */
public interface PcepLabelObject {

    /**
     * Returns O flag in Label Object.
     *
     * @return Boolean value
     */
    boolean getOFlag();

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

    /**
     * Returns Label from Label Object.
     *
     * @return Label value
     */
    int getLabel();

    /**
     * Sets Label field in Label Object with specified value.
     *
     * @param value Label
     */
    void setLabel(int value);

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

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

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

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

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

        /**
         * Builds Label Object.
         *
         * @return Label Object
         * @throws PcepParseException while building LABEL object.
         */
        PcepLabelObject build() throws PcepParseException;

        /**
         * Returns Label object header.
         *
         * @return Label object header
         */
        PcepObjectHeader getLabelObjHeader();

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

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

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

        /**
         * Returns Label from Label Object.
         *
         * @return Label value
         */
        int getLabel();

        /**
         * Sets Label field and return its builder.
         *
         * @param value Label field
         * @return Builder by setting Label field
         */
        Builder setLabel(int value);

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

        /**
         * Sets list of Optional Tlvs and return 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 Label object header and returns its builder.
         *
         * @param value boolean value to set P flag
         * @return Builder by setting P flag
         */
        public Builder setPFlag(boolean value);

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