#ifndef BAL_OBJ
#define BAL_OBJ

#include <bcmos_system.h>
#include <bcmos_errno.h>
#include "bal_model_ids.h"
#include "bal_buf.h"
#include "bal_msg_type.h"

/*
 * The current BAL header version
 */
#define BAL_HDR_VERSION_MAJOR    (1)
#define BAL_HDR_VERSION_MINOR    (1)

/*
 * The BAL common message header
 */
typedef struct bal_comm_msg_hdr
{
    bcmos_msg        m;               /**< bcmos message header */
    uint16_t         version_major;   /**< Header Major version number */
    uint16_t         version_minor;   /**< Header Minor version number */
    bcmbal_msg_type  msg_type;        /**< Request / Response / Ack / Indication */
    uint32_t         msg_id;          /**< Message ID – the ID of the message (subID under the message type) */
    uint32_t         ex_id;           /**< Exchange ID for message tracking between endpoints */
    bal_subsystem    sender;          /**< Sender subsystem - used for additional validation */
    uint32_t         timestamp;       /**< Timestamp when the message was sent */
    bcmos_sem        sem;             /**< Semaphore used for inter-thread communication */
    void*            scratchpad;      /**< Scratchpad used for inter-thread communication */
    uint8_t          payload[];       /**< Payload follows the header */
} bal_comm_msg_hdr;

/** Version of Object definitions */
#define BCMBAL_OBJ_VERSION     2                 /**< The current version number */
typedef uint32_t bcmbal_object_ver;              /**< The attribute type in the object info structure */

/** Bitmask of object attributes that are specified in an object (1 = specified, 0 = not specified) */
typedef uint64_t bcmbal_presence_mask;

/** Presence mask indicating all fields present */
#define BCMBAL_PRESENCE_MASK_ALL ((bcmbal_presence_mask)0xFFFFFFFFFFFFFFFF)

/** Helper type to determine what the data format of a message should look like */
typedef enum bcmbal_mgt_group
{
    BCMBAL_MGT_GROUP_KEY,               /**< Key that uniquely identifies object instance */
    BCMBAL_MGT_GROUP_CFG,               /**< Configuration (get/set/clear) */
    BCMBAL_MGT_GROUP_STAT,              /**< Statistics */
    BCMBAL_MGT_GROUP_AUTO,              /**< Autonomous indications */
    BCMBAL_MGT_GROUP_AUTO_CFG,          /**< Autonomous indication configuration */
    BCMBAL_MGT_GROUP__NUM_OF
} bcmbal_mgt_group;

/** Object message type. Can be a combination of flags. */
typedef enum bcmbal_obj_msg_type
{
    BCMBAL_OBJ_MSG_TYPE_GET   = 0x01,   /**< Get configuration parameters */
    BCMBAL_OBJ_MSG_TYPE_SET   = 0x02,   /**< Set configuration parameters */
    BCMBAL_OBJ_MSG_TYPE_CLEAR = 0x04,   /**< Clear configuration parameters */
} bcmbal_obj_msg_type;

/** Object message direction - request or response. */
typedef enum bcmbal_obj_msg_dir
{
    BCMBAL_OBJ_MSG_DIR_REQUEST,
    BCMBAL_OBJ_MSG_DIR_RESPONSE
} bcmbal_obj_msg_dir;

#define BCMBAL_OBJ_INIT_VAL  0xdeadbeef /**< The value of the obj_init_val after macro initialization */

/** Information common to all BAL objects */
typedef struct bcmbal_obj
{
    bal_comm_msg_hdr     comm_hdr;      /**< Communication header */
    bcmbal_object_ver    version;       /**< Version of the Object definition/structure */
    bcmbal_obj_id        obj_type;      /**< An enumerated ID associated with the object being specified */
    bcmbal_mgt_group     group;         /**< Management group */
    uint16_t             subgroup;      /**< Subgroup for indications */
    bcmbal_obj_msg_type  type;          /**< Type (e.g. get / set / clear)  */
    bcmbal_obj_msg_dir   dir;           /**< Direction - request / response */
    bcmos_errno		     status;        /**< BAL status code (BCM_ERR_OK–success, error code otherwise) */
    bcmbal_presence_mask presence_mask; /**< Indicates which attribute parameters are present */

    /* The following fields are internal. They are not sent on the line */
    bcmos_bool           is_inprogress; /**< RO - When set to TRUE: Object is changing state internally */
    void                *list_buf;      /**< Memory buffer in which to store variable-sized lists when unpacking */
    uint32_t             list_buf_size; /**< Number of bytes in the variable-sized list buffer */
    uint32_t             obj_init_val;  /**< An field that is set on INIT macro call, and checked by the API */
} bcmbal_obj;

/** Information structure for use with BAL configuration API (get/set/clear) */
typedef struct bcmbal_cfg
{
    bcmbal_obj hdr;
} bcmbal_cfg;

/** Information structure for BAL statistics API */
typedef struct bcmbal_stat
{
    bcmbal_obj hdr;
} bcmbal_stat;

/** Information structure for BAL indications */
typedef struct bcmbal_auto
{
    bcmbal_obj hdr;
} bcmbal_auto;

/** Information structure for BAL indication configuration API */
typedef struct bcmbal_auto_cfg
{
    bcmbal_obj hdr;
} bcmbal_auto_cfg;

/** Whether we pack the entire structure of a message */
static inline bcmos_bool bcmbal_obj_msg_should_pack_data(const bcmbal_obj *msg)
{
    switch (msg->group)
    {
        case BCMBAL_MGT_GROUP_CFG:
        case BCMBAL_MGT_GROUP_STAT:
        case BCMBAL_MGT_GROUP_AUTO_CFG:
            if ((msg->type & BCMBAL_OBJ_MSG_TYPE_GET))
            {
                return (msg->dir == BCMBAL_OBJ_MSG_DIR_RESPONSE);
            }
            else if ((msg->type & BCMBAL_OBJ_MSG_TYPE_SET))
            {
                return (msg->dir == BCMBAL_OBJ_MSG_DIR_REQUEST);
            }
            else
            {
                return BCMOS_FALSE;
            }

        default:
            return BCMOS_TRUE;
    }
}

/** Get the packed length of the header portion of an object message */
static inline int32_t bcmbal_obj_msg_hdr_get_packed_length(void)
{
    return 24;
}

/** Pack a message header to a byte stream */
static inline bcmos_errno bcmbal_obj_msg_hdr_pack(const bcmbal_obj *msg, bcmbal_buf *buf)
{
    bcmos_bool ret;

    ret =        bcmbal_buf_write_u32(buf, (uint32_t)msg->version);
    ret = ret && bcmbal_buf_write_u8(buf, (uint32_t)msg->obj_type);
    ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->group);
    ret = ret && bcmbal_buf_write_u16(buf, msg->subgroup);
    ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->type);
    ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->dir);
    ret = ret && bcmbal_buf_write_s16(buf, (int16_t)msg->status);
    ret = ret && bcmbal_buf_write_u32(buf, (int32_t)msg->is_inprogress);    
    ret = ret && bcmbal_buf_write_u64(buf, (uint64_t)msg->presence_mask);

    return ret ? BCM_ERR_OK : BCM_ERR_OVERFLOW;
}

/** Unpack a message header from a byte stream */
static inline bcmos_errno bcmbal_obj_msg_hdr_unpack(bcmbal_obj *msg, bcmbal_buf *buf)
{
    uint32_t   version;
    uint8_t    obj_type;
    uint8_t    group;
    uint16_t   subgroup;
    uint8_t    type;
    uint8_t    dir;
    int16_t    status;
    uint32_t   is_inprogress;
    uint64_t   presence_mask;
    bcmos_bool ret;

    ret =        bcmbal_buf_read_u32(buf, &version);
    ret = ret && bcmbal_buf_read_u8(buf, &obj_type);
    ret = ret && bcmbal_buf_read_u8(buf, &group);
    ret = ret && bcmbal_buf_read_u16(buf, &subgroup);
    ret = ret && bcmbal_buf_read_u8(buf, &type);
    ret = ret && bcmbal_buf_read_u8(buf, &dir);
    ret = ret && bcmbal_buf_read_s16(buf, &status);
    ret = ret && bcmbal_buf_read_u32(buf, &is_inprogress);    
    ret = ret && bcmbal_buf_read_u64(buf, &presence_mask);
    if (ret)
    {
        msg->version = (bcmbal_object_ver)version;
        msg->obj_type = (bcmbal_obj_id)obj_type;
        msg->group = (bcmbal_mgt_group)group;
        msg->subgroup = subgroup;
        msg->type = (bcmbal_obj_msg_type)type;
        msg->dir = (bcmbal_obj_msg_dir)dir;
        msg->status = (bcmos_errno)status;
        msg->is_inprogress = (bcmos_bool)is_inprogress;
        msg->presence_mask = (bcmbal_presence_mask)presence_mask;
    }

    return ret ? BCM_ERR_OK : BCM_ERR_OVERFLOW;
}

#endif /* BAL_OBJ */
