/**
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *
 *    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.
 */

/**
 *    @file
 *      This file describes a AdditionalData Payload parser based on the
 *      CHIP specification.
 */

#pragma once

#include "AdditionalDataPayload.h"

#include <core/CHIPError.h>
#include <stdint.h>

namespace chip {

/**
 * @class AdditionalDataPayloadParser
 * A class that can be used to convert a HEX encoded payload to a AdditionalDataPayload object
 * */
class AdditionalDataPayloadParser
{
private:
    const uint8_t * mPayloadBufferData;
    const uint32_t mPayloadBufferLength;

public:
    /**
     * Constructs the Additional Data payload parser with payload buffer data
     * and the buffer size
     *
     * @param[in] payloadBufferData        The buffer data for the additional data payload,
     *                                     it needs to outlive the lifetime of this parse.
     * @param[in] payloadBufferLength      The buffer data length for the additional data payload.
     */
    AdditionalDataPayloadParser(const uint8_t * payloadBufferData, const uint32_t payloadBufferLength) :
        mPayloadBufferData(payloadBufferData), mPayloadBufferLength(payloadBufferLength)
    {}

    /**
     * Parses the Additional Data payload buffer and constructs all the fields
     * of the Additional Data structure.
     *
     * @param[out] outPayload              Additional data payload stucture.
     *
     *
     * @retval #CHIP_NO_ERROR              If the reader was successfully positioned on a new element.
     * @retval #CHIP_END_OF_TLV            If no further elements are available.
     * @retval #CHIP_ERROR_TLV_UNDERRUN    If the underlying TLV encoding ended prematurely.
     * @retval #CHIP_ERROR_INVALID_TLV_ELEMENT
     *                                      If the reader encountered an invalid or unsupported TLV element
     *                                      type.
     * @retval #CHIP_ERROR_INVALID_TLV_TAG If the reader encountered a TLV tag in an invalid context.
     * @retval #CHIP_ERROR_UNKNOWN_IMPLICIT_TLV_TAG
     *                                      If the reader encountered a implicitly-encoded TLV tag for which
     *                                      the corresponding profile id is unknown.
     * @retval other                        Other CHIP or platform error codes returned by the configured
     *                                      GetNextBuffer() function. Only possible when GetNextBuffer is
     *                                      non-NULL.
     */
    CHIP_ERROR populatePayload(SetupPayloadData::AdditionalDataPayload & outPayload);
};

} // namespace chip
