package org.onosproject.pcepio.protocol;

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

/**
 * Abstraction of an entity Provides PCEP Message PAth for update message.
 * Reference :PCE extensions for stateful draft-ietf-pce-stateful-pce-10.
 */
public interface PcepMsgPath {

    /**
     * Returns object of PcepEroObject.
     *
     * @return eroObject
     */
    PcepEroObject getEroObject();

    /**
     * Returns object of PcepAttribute.
     *
     * @return pcepAttribute
     */
    PcepAttribute getPcepAttribute();

    /**
     * Sets PcepEroObject.
     *
     * @param eroObject PCEP ERO Object.
     */
    void setEroObject(PcepEroObject eroObject);

    /**
     * Sets PcepAttribute.
     *
     * @param pcepAttribute PCEP-Attribute.
     */
    void setPcepAttribute(PcepAttribute pcepAttribute);

    /**
     * reads ERO object and attribute list.
     *
     * @param bb of type channel buffer
     * @return PcepMsgPath
     * @throws PcepParseException while parsing Message Path from Channel Buffer.
     */
    public PcepMsgPath read(ChannelBuffer bb) throws PcepParseException;

    /**
     * writes ERO object and attribute list to channel.
     *
     * @param bb of type channel buffer
     * @return object length index
     * @throws PcepParseException while writing Message Path into Channel Buffer.
     */

    public int write(ChannelBuffer bb) throws PcepParseException;

    /**
     * Prints the attributes of PCEP message path.
     */
    void print();

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

        /**
         * Builds PcepMsgPath.
         *
         * @return PcepMsgPath
         * @throws PcepParseException when mandatory object is not set
         */
        PcepMsgPath build() throws PcepParseException;

        /**
         * Returns object of PcepEroObject.
         *
         * @return PcepEroObject
         */
        PcepEroObject getEroObject();

        /**
         * Returns object of PcepAttribute.
         *
         * @return pcepAttribute
         */
        PcepAttribute getPcepAttribute();

        /**
         * Sets PcepEroObject.
         *
         * @param eroObject PcepEroObject
         * @return Builder by setting ERO object.
         */
        Builder setEroObject(PcepEroObject eroObject);

        /**
         * Sets PcepAttribute.
         *
         * @param pcepAttribute PCEP-Attribute
         * @return Builder by setting PCEP-Attribute.
         */
        Builder setPcepAttribute(PcepAttribute pcepAttribute);
    }
}
