/*
 * 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;

/**
 * Abstraction of an entity which Provides List of PCEP Attributes.
 */
import java.util.LinkedList;

import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;

public interface PcepAttribute {

    /**
     * writes lspa , bandwidth , Metriclist and Iro objects to the channel.
     *
     * @param bb of type channel buffer.
     * @return object length index.
     * @throws PcepParseException while writing objects to channel buffer
     */
    public int write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Returns PcepLspaObject.
     *
     * @return LspaObject
     */
    PcepLspaObject getLspaObject();

    /**
     * Returns PcepBandwidthObject.
     *
     * @return BandwidthObject
     */
    PcepBandwidthObject getBandwidthObject();

    /**
     * Returns PcepIroObject.
     *
     * @return iroObject
     */
    PcepIroObject getIroObject();

    /**
     * Sets the PcepBandwidthObject.
     *
     * @param bandwidthObject bandwidth object
     */
    void setBandwidthObject(PcepBandwidthObject bandwidthObject);

    /**
     * Sets the PcepLspaObject.
     *
     * @param lspaObject lspa object
     */
    void setLspaObject(PcepLspaObject lspaObject);

    /**
     * Sets the PcepIroObject.
     *
     * @param iroObject iro object
     */
    void setIroObject(PcepIroObject iroObject);

    /**
     * Returns PcepMetricObject List.
     *
     * @return list of metric objects
     */
    LinkedList<PcepMetricObject> getMetricObjectList();

    /**
     * Sets PcepMetricObject List.
     *
     * @param llMetricList list of metric objects
     */
    void setMetricObjectList(LinkedList<PcepMetricObject> llMetricList);

    /**
     * Prints the attributes of AttributeList.
     */

    public void print();

    /**
     * Builder interface with get and set functions to build PcepAttribute.
     */
    public interface Builder {

        /**
         * Builds PcepAttribute.
         *
         * @return PcepAttribute
         */
        PcepAttribute build();

        /**
         * Returns PcepLspaObject.
         *
         * @return LspaObject
         */
        PcepLspaObject getLspaObject();

        /**
         * Returns PcepBandwidthObject.
         *
         * @return BandwidthObject
         */
        PcepBandwidthObject getBandwidthObject();

        /**
         * Returns PcepIroObject.
         *
         * @return iroObject
         */
        PcepIroObject getIroObject();

        /**
         * Sets the PcepBandwidthObject.
         *
         * @param bandwidthObject bandwidth object
         * @return Builder object for PcepAttrubute
         */
        Builder setBandwidthObject(PcepBandwidthObject bandwidthObject);

        /**
         * Sets the PcepLspaObject.
         *
         * @param lspaObject lspa object
         * @return Builder object for PcepAttrubute
         */
        Builder setLspaObject(PcepLspaObject lspaObject);

        /**
         * Sets the PcepIroObject.
         *
         * @param iroObject iro object
         * @return Builder object for PcepAttrubute
         */
        Builder setIroObject(PcepIroObject iroObject);

        /**
         * Returns PcepMetricObject List.
         *
         * @return list of metric objects
         */
        LinkedList<PcepMetricObject> getMetricObjectList();

        /**
         * Sets PcepMetricObject List.
         *
         * @param llMetricList list of metric objects
         * @return Builder object for PcepAttrubute
         */
        Builder setMetricObjectList(LinkedList<PcepMetricObject> llMetricList);
    }
}