/**
 *
 *    Copyright (c) 2021 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.
 */

#pragma once

#include <app/AppBuildConfig.h>
#include <app/util/basic-types.h>
#include <lib/core/CHIPCore.h>
#include <lib/core/CHIPTLV.h>
#include <lib/support/CodeUtils.h>
#include <lib/support/logging/CHIPLogging.h>

#include "CommandDataIB.h"
#include "CommandStatusIB.h"
#include "StructBuilder.h"
#include "StructParser.h"

namespace chip {
namespace app {
namespace InvokeResponseIB {
enum class Tag : uint8_t
{
    kCommand = 0,
    kStatus  = 1,
};

class Parser : public StructParser
{
public:
#if CHIP_CONFIG_IM_PRETTY_PRINT
    CHIP_ERROR PrettyPrint() const;
#endif // CHIP_CONFIG_IM_PRETTY_PRINT

    /**
     *  @brief Get a parser for a Command.
     *
     *  @param [in] apCommand    A pointer to the CommandDataIB parser.
     *
     *  @return #CHIP_NO_ERROR on success
     *          #CHIP_END_OF_TLV if there is no such element
     */
    CHIP_ERROR GetCommand(CommandDataIB::Parser * const apCommand) const;

    /**
     *  @brief Get a parser for a Status.
     *
     *  @param [in] apStatus    A pointer to the CommandStatusIB parser.
     *
     *  @return #CHIP_NO_ERROR on success
     *          #CHIP_END_OF_TLV if there is no such element
     */
    CHIP_ERROR GetStatus(CommandStatusIB::Parser * const apStatus) const;
};

class Builder : public StructBuilder
{
public:
    /**
     *  @brief Initialize a CommandDataIB::Builder for writing into the TLV stream
     *
     *  @return A reference to CommandDataIB::Builder
     */
    CommandDataIB::Builder & CreateCommand();

    /**
     *  @return A reference to CommandDataIB::Builder
     */
    CommandDataIB::Builder & GetCommand() { return mCommand; }

    /**
     *  @return A reference to CommandStatusIB::Builder
     */
    CommandStatusIB::Builder & GetStatus() { return mStatus; }

    /**
     *  @brief Initialize a CommandStatusIB::Builder for writing into the TLV stream
     *
     *  @return A reference to CommandStatusIB::Builder
     */
    CommandStatusIB::Builder & CreateStatus();

    /**
     *  @brief Mark the end of this InvokeCommand
     *
     *  @return A reference to *this
     */
    InvokeResponseIB::Builder & EndOfInvokeResponseIB();

private:
    CommandDataIB::Builder mCommand;
    CommandStatusIB::Builder mStatus;
};
} // namespace InvokeResponseIB
} // namespace app
} // namespace chip
