/*
 * 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.onosproject.pcepio.exceptions.PcepParseException;

/**
 * Abstraction of an entity Provides PcInitiatedLspRequest for PCEP Initiate message.
 * Reference : PCE initiated tunnel setup draft-ietf-pce-pce-initiated-lsp-03.
 */
public interface PcInitiatedLspRequest {

    /**
     * Returns object of PcepSrpObject.
     *
     * @return srpObject PCEP SRP object
     */
    PcepSrpObject getSrpObject();

    /**
     * Returns object of PcepLspObject.
     *
     * @return lspObject PCEP LSP object
     */
    PcepLspObject getLspObject();

    /**
     * Returns object of PcepEndPointsObject.
     *
     * @return endPointsObject PCEP EndPoints object
     */
    PcepEndPointsObject getEndPointsObject();

    /**
     * Returns object of PcepEroObject.
     *
     * @return eroObject PCEP ERO object
     */
    PcepEroObject getEroObject();

    /**
     * Returns object of PcepAttribute.
     *
     * @return pcepAttribute PCEP Attributes
     */
    PcepAttribute getPcepAttribute();

    /**
     * Sets PcepSrpObject.
     *
     * @param srpobj PCEP SRP object
     */
    void setSrpObject(PcepSrpObject srpobj);

    /**
     * Sets PcepLspObject.
     *
     * @param lspObject PCEP LSP object
     */
    void setLspObject(PcepLspObject lspObject);

    /**
     * Sets PcepEndPointsObject.
     *
     * @param endPointsObject PCEP EndPoints object
     */
    void setEndPointsObject(PcepEndPointsObject endPointsObject);

    /**
     * Sets PcepEroObject.
     *
     * @param eroObject PCEP ERO object
     */
    void setEroObject(PcepEroObject eroObject);

    /**
     * Sets PcepAttribute.
     *
     * @param pcepAttribute PCEP Attributes
     */
    void setPcepAttribute(PcepAttribute pcepAttribute);

    /**
     * Prints the attribute of PC-INITIATED LSP INITIATION REQUEST.
     */
    void print();

    /**
     * Builder interface with get and set functions to build PcInitiatedLspRequest.
     */
    public interface Builder {

        /**
         * Builds PcInitiatedLspRequest.
         *
         * @return PcInitiatedLspRequest
         * @throws PcepParseException when mandatory object is not set
         */
        PcInitiatedLspRequest build() throws PcepParseException;

        /**
         * Returns object of PcepSrpObject.
         *
         * @return srpObject
         */
        PcepSrpObject getSrpObject();

        /**
         * Returns object of PcepLspObject.
         *
         * @return lspObject
         */
        PcepLspObject getLspObject();

        /**
         * Returns object of PcepEndPointsObject.
         *
         * @return endPointsObject
         */
        PcepEndPointsObject getEndPointsObject();

        /**
         * Returns object of PcepEroObject.
         *
         * @return eroObject
         */
        PcepEroObject getEroObject();

        /**
         * Returns object of PcepAttribute.
         *
         * @return pcepAttribute
         */
        PcepAttribute getPcepAttribute();

        /**
         * Sets PcepSrpObject.
         *
         * @param srpobj PCEP SRP Object
         * @return builder by setting PcepSrpObject
         */
        Builder setSrpObject(PcepSrpObject srpobj);

        /**
         * Sets PcepLspObject.
         *
         * @param lspObject PCEP LSP Object
         * @return builder by setting PcepLspObject
         */
        Builder setLspObject(PcepLspObject lspObject);

        /**
         * Sets PcepEndPointsObject.
         *
         * @param endPointsObject EndPoints Object
         * @return builder by setting PcepEndPointsObject
         */
        Builder setEndPointsObject(PcepEndPointsObject endPointsObject);

        /**
         * Sets PcepEroObject.
         *
         * @param eroObject PCEP ERO Object
         * @return builder by setting PcepEroObject
         */
        Builder setEroObject(PcepEroObject eroObject);

        /**
         * Sets PcepAttribute.
         *
         * @param pcepAttribute PCEP Attributes
         * @return builder by setting PcepAttribute
         */
        Builder setPcepAttribute(PcepAttribute pcepAttribute);
    }
}
