#pragma once

#include "bej_common.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @brief Holds info needed to encode a parent in the JSON tree.
 */
struct BejEncoderParentMetaData
{
    // Starting dictionary index of the children properties.
    uint16_t childrenDictPropOffset;
    // Index of the child pointed by nextChild. Used to store the array
    // indexes of bejArray elements.
    uint16_t nextChildIndex;
    // BEJ sequence number of the property.
    uint32_t sequenceNumber;
    // Size needed to encode Sequence number, Format and Length of the
    // value.
    size_t sflSize;
    // Size of the value.
    size_t vSize;
    // Dictionary used for this parent.
    const uint8_t* dictionary;
    // Points to the next node which is need to process.
    void* nextChild;
};

/**
 * @brief Holds info needed to encode a leaf type in the JSON tree.
 */
struct BejEncoderLeafMetaData
{
    // BEJ sequence number of the property.
    uint32_t sequenceNumber;
    // Size needed to encode Sequence number, Format and Length of the
    // value.
    size_t sflSize;
    // Size of the value.
    size_t vSize;
};

/**
 * @brief Common attributes of a JSON property.
 */
struct RedfishPropertyNode
{
    const char* name;
    struct BejTupleF format;
    // Properties belonging to the same set or
    // array and has the same depth.
    void* sibling;
};

/**
 * @brief Used to store parent type property info.
 *
 * bejArray, bejSet and bejPropertyAnnotation are the parent type nodes.
 */
struct RedfishPropertyParent
{
    // Common property attributes.
    struct RedfishPropertyNode nodeAttr;
    // Number of children in the case of bejSet
    // or bejArray.
    size_t nChildren;
    //  Points to the first child.
    void* firstChild;
    // Points to the last child. Technically we only need the firstChild
    // pointer to add a new element to the list. But to support bejArray
    // type, we need to traverse the linked list in the same order as the
    // elements in the array. So we need a pointer to the first child and
    // keep adding new nodes using the lastChild.
    void* lastChild;
    // Metadata used during encoding.
    struct BejEncoderParentMetaData metaData;
};

/**
 * @brief Used to store leaf type property info.
 *
 * Every type that doesn't belong to parent type are considered as a leaf
 * property within a JSON tree. Each specific leaf type has its own struct.
 * They should include this struct as the first member of their struct.
 */
struct RedfishPropertyLeaf
{
    struct RedfishPropertyNode nodeAttr;
    struct BejEncoderLeafMetaData metaData;
};

/**
 * @brief bejNull type property node.
 */
struct RedfishPropertyLeafNull
{
    struct RedfishPropertyLeaf leaf;
};

/**
 * @brief bejInteger type property node.
 */
struct RedfishPropertyLeafInt
{
    struct RedfishPropertyLeaf leaf;
    int64_t value;
};

/**
 * @brief bejEnum type property node.
 */
struct RedfishPropertyLeafEnum
{
    struct RedfishPropertyLeaf leaf;
    // A string representation of the enum value.
    const char* value;
    // Sequence number of the enum value. Populated during bej encoding.
    uint16_t enumValueSeq;
};

/**
 * @brief bejString type property node.
 */
struct RedfishPropertyLeafString
{
    struct RedfishPropertyLeaf leaf;
    const char* value;
};

/**
 * @brief bejReal type property node.
 */
struct RedfishPropertyLeafReal
{
    struct RedfishPropertyLeaf leaf;
    double value;
    // bejReal representation of the value. Populated during bej encoding.
    struct BejReal bejReal;
};

/**
 * @brief bejBoolean type property node.
 */
struct RedfishPropertyLeafBool
{
    struct RedfishPropertyLeaf leaf;
    bool value;
};

/**
 * @brief Initialize a bejSet type node.
 *
 * @param[in] node - pointer to a RedfishPropertyParent struct.
 * @param[in] name - name of the node.
 */
void bejTreeInitSet(struct RedfishPropertyParent* node, const char* name);

/**
 * @brief Initialize a bejArray type node.
 *
 * @param[in] node - pointer to a RedfishPropertyParent struct.
 * @param[in] name - name of the node.
 */
void bejTreeInitArray(struct RedfishPropertyParent* node, const char* name);

/**
 * @brief Initialize a bejPropertyAnnotation type node.
 *
 * @param[in] node - pointer to a RedfishPropertyParent struct.
 * @param[in] name - name of the node.
 */
void bejTreeInitPropertyAnnotated(struct RedfishPropertyParent* node,
                                  const char* name);

/**
 * @brief Check if a node is a parent type node.
 *
 * @param node - node to be checked.
 * @return true if the node is a parent type node.
 */
bool bejTreeIsParentType(struct RedfishPropertyNode* node);

/**
 * @brief Initialize a bejNull type node.
 *
 * @param parent - a pointer to an initialized parent struct.
 * @param child - a pointer to an uninitialized bejNull type node.
 * @param name - name of the bejNull type property.
 */
void bejTreeAddNull(struct RedfishPropertyParent* parent,
                    struct RedfishPropertyLeafNull* child, const char* name);

/**
 * @brief Add a bejInteger type node to a parent node.
 *
 * @param[in] parent - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an uninitialized bejInteger type node.
 * @param[in] name - name of the bejInteger type property.
 * @param[in] value - value of the bejInteger type property.
 */
void bejTreeAddInteger(struct RedfishPropertyParent* parent,
                       struct RedfishPropertyLeafInt* child, const char* name,
                       int64_t value);

/**
 * @brief Set a new value in bejInteger type node.
 *
 * @param[in] node - initialized bejInteger type node.
 * @param[in] newValue - new integer value.
 */
void bejTreeSetInteger(struct RedfishPropertyLeafInt* node, int64_t newValue);

/**
 * @brief Add a bejEnum type node to a parent node.
 *
 * @param[in] parent - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an uninitialized bejEnum type node.
 * @param[in] name - name of the bejEnum type property.
 * @param[in] value - value of the bejEnum type property.
 */
void bejTreeAddEnum(struct RedfishPropertyParent* parent,
                    struct RedfishPropertyLeafEnum* child, const char* name,
                    const char* value);

/**
 * @brief Add a bejString type node to a parent node.
 *
 * @param[in] parent - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an uninitialized bejString type node.
 * @param[in] name - name of the bejString type property.
 * @param[in] value - value of the bejString type property.
 */
void bejTreeAddString(struct RedfishPropertyParent* parent,
                      struct RedfishPropertyLeafString* child, const char* name,
                      const char* value);

/**
 * @brief Add a bejReal type node to a parent node.
 *
 * @param[in] parent - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an uninitialized bejReal type node.
 * @param[in] name - name of the bejReal type property.
 * @param[in] value - value of the bejReal type property.
 */
void bejTreeAddReal(struct RedfishPropertyParent* parent,
                    struct RedfishPropertyLeafReal* child, const char* name,
                    double value);

/**
 * @brief Set a new value in bejReal type node.
 *
 * @param[in] node - initialized bejReal type node.
 * @param[in] newValue - new double value.
 */
void bejTreeSetReal(struct RedfishPropertyLeafReal* node, double newValue);

/**
 * @brief Add a bejBoolean type node to a parent node.
 *
 * @param[in] parent - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an uninitialized bejBoolean type node.
 * @param[in] name - name of the bejBoolean type property.
 * @param[in] value - value of the bejBoolean type property.
 */
void bejTreeAddBool(struct RedfishPropertyParent* parent,
                    struct RedfishPropertyLeafBool* child, const char* name,
                    bool value);

/**
 * @brief Link a node to its parent.
 *
 * @param[in] parent  - a pointer to an initialized parent struct.
 * @param[in] child - a pointer to an initialized child struct.
 */
void bejTreeLinkChildToParent(struct RedfishPropertyParent* parent,
                              void* child);

/**
 * @brief Set Bej format flags of a node.
 *
 * @param node - an initialized node.
 * @param deferredBinding - set deferred binding flag.
 * @param readOnlyProperty - set read only property flag.
 * @param nullableProperty - set nullable property flag.
 */
void bejTreeUpdateNodeFlags(struct RedfishPropertyNode* node,
                            bool deferredBinding, bool readOnlyProperty,
                            bool nullableProperty);

/**
 * @brief Get the next child node to be processed.
 *
 * This function returns the next child node of the parent node. This also
 * updates the parent node's next child properties.
 *
 * @param parent - parent node.
 * @param currentChild - current child node being processed.
 * @return pointer to the next child node to be processed. NULL if there is
 * no next child or one of the params are NULL.
 */
void* bejParentGoToNextChild(struct RedfishPropertyParent* parent,
                             struct RedfishPropertyNode* currentChild);

#ifdef __cplusplus
}
#endif
