/*
 * 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 org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;

/**
 * Abstraction of an entity provides State Report for PCEP Report Message.
 */
public interface PcepStateReport {

    /**
     * Provides PCEP Message path for report message.
     */
    public interface PcepMsgPath {

        /**
         * Returns PcepEroObject.
         *
         * @return eroObj
         */
        PcepEroObject getEroObject();

        /**
         * Sets PcepEroObject.
         *
         * @param eroObject Ero Object
         */
        void setEroObject(PcepEroObject eroObject);

        /**
         * Returns PcepAttribute.
         *
         * @return attrList
         */
        PcepAttribute getPcepAttribute();

        /**
         * Sets PcepAttribute.
         *
         * @param pcepAttribute Pcep Attribute object
         */
        void setPcepAttribute(PcepAttribute pcepAttribute);

        /**
         * Returns PcepRroObject.
         *
         * @return rroObj
         */
        PcepRroObject getRroObject();

        /**
         * Sets PcepRroObject.
         *
         * @param rroObject Rro object
         */
        void setRroObject(PcepRroObject rroObject);

        /**
         * Returns PcepBandwidthObject.
         *
         * @return bandwidth object
         */
        PcepBandwidthObject getBandwidthObject();

        /**
         * Sets PcepBandwidthObject.
         *
         * @param bandwidth bandwidth object
         */
        void setBandwidthObject(PcepBandwidthObject bandwidth);

        /**
         * Reads all the Objects for PCEP Message Path.
         *
         * @param bb of type channel buffer
         * @return PCEP Message path
         * @throws PcepParseException when invalid buffer received
         */
        public PcepMsgPath read(ChannelBuffer bb) throws PcepParseException;

        /**
         * Writes all the objects for pcep message path.
         *
         * @param bb of type channel buffer.
         * @return object length index
         * @throws PcepParseException when mandatory object is not set
         */
        public int write(ChannelBuffer bb) throws PcepParseException;

        /***
         * Prints the attribute of PCEP Message Path.
         */
        public void print();

    }

    /**
     * Returns PcepSrpObject.
     *
     * @return srpObject
     */
    PcepSrpObject getSrpObject();

    /**
     * Returns PcepLspObject.
     *
     * @return lspObject
     */
    PcepLspObject getLspObject();

    /**
     * Returns PcepMsgPath.
     *
     * @return msgPath
     */
    PcepMsgPath getMsgPath();

    /**
     * Sets the SRP Object.
     *
     * @param srpObj Pcep Srp Object
     */
    void setSrpObject(PcepSrpObject srpObj);

    /**
     * Sets the LSP Object.
     *
     * @param lspObject Pcep Lsp Object
     */
    void setLspObject(PcepLspObject lspObject);

    /**
     * Sets the Path Object.
     *
     * @param msgPath Pcep MsgPath object
     */
    void setMsgPath(PcepMsgPath msgPath);

    /**
     * Prints the attribute of PCEP state report.
     */
    public void print();

    /**
     * Builder interface with get and set functions to build PcepStateReport.
     */
    public interface Builder {

        /**
         * Builds PcepStateReport.
         *
         * @return PcepStateReport
         * @throws PcepParseException when mandatory object is not set
         */
        PcepStateReport build() throws PcepParseException;

        /**
         * Returns PcepSrpObject.
         *
         * @return srpObject
         */
        PcepSrpObject getSrpObject();

        /**
         * Returns PcepLspObject.
         *
         * @return lspObject
         */
        PcepLspObject getLspObject();

        /**
         * Returns PcepMsgPath.
         *
         * @return msgPath
         */
        PcepMsgPath getMsgPath();

        /**
         * Sets the SRP Object.
         *
         * @param srpObj Pcep Srp Object
         * @return builder by setting PcepSrpObject
         */
        Builder setSrpObject(PcepSrpObject srpObj);

        /**
         * Sets the LSP Object.
         *
         * @param lspObject Pcep Lsp Object
         * @return builder by setting PcepLspObject
         */
        Builder setLspObject(PcepLspObject lspObject);

        /**
         * Sets the Path Object.
         *
         * @param msgPath Pcep MsgPath object
         * @return builder by setting PcepMsgPath
         */
        Builder setMsgPath(PcepMsgPath msgPath);
    }
}
