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 Error Object.
 */
public interface PcepErrorObject {

    /**
     * Returns Error Type in Error Object.
     *
     * @return Error Type in Error Object
     */
    int getErrorType();

    /**
     * Sets Error Type in Error Object.
     *
     * @param value Error Type
     */
    void setErrorType(byte value);

    /**
     * Returns Error Value in Error Object.
     *
     * @return Error Value
     */
    byte getErrorValue();

    /**
     * Sets Error Value in Error Object.
     *
     * @param value Error Value
     */
    void setErrorValue(byte value);

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

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

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

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

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

        /**
         * Builds Error Object.
         *
         * @return Error Object.
         */
        PcepErrorObject build();

        /**
         * Returns Error Object header.
         *
         * @return Error Object header
         */
        PcepObjectHeader getErrorObjHeader();

        /**
         * Sets Error Object header and returns its Builder.
         *
         * @param obj Error Object header
         * @return Builder by setting Error Object header
         */
        Builder setErrorObjHeader(PcepObjectHeader obj);

        /**
         * Returns Error Type in Error Object.
         *
         * @return Error Type in Error Object
         */
        int getErrorType();

        /**
         * Sets Error Type and returns its builder.
         *
         * @param value of Error-Type field
         * @return builder by setting Error Type field.
         */
        Builder setErrorType(byte value);

        /**
         * Returns Error Value in Error Object.
         *
         * @return Error Value
         */
        byte getErrorValue();

        /**
         * Sets Error Value and returns its builder.
         *
         * @param value of Error-Value field
         * @return Builder by setting Error Value field.
         */
        Builder setErrorValue(byte value);

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

        /**
         * Sets Optional Tlvs of Error Object and returns its Builder.
         *
         * @param llOptionalTlv Optional Tlvs of Error Object
         * @return Builder by setting Optional Tlvs.
         */
        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);

        /**
         * Sets P flag in Error object header and returns its builder.
         *
         * @param value boolean value to set P flag
         * @return Builder by setting P flag
         */
        Builder setPFlag(boolean value);

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