#include "ipmid.hpp"
#include "nlohmann/json.hpp"

/** @brief The set channel access IPMI command.
 *
 *  @param[in] netfn
 *  @param[in] cmd
 *  @param[in] request
 *  @param[in,out] response
 *  @param[out] data_len
 *  @param[in] context
 *
 *  @return IPMI_CC_OK on success, non-zero otherwise.
 */
ipmi_ret_t ipmi_set_channel_access(
        ipmi_netfn_t netfn,
        ipmi_cmd_t cmd,
        ipmi_request_t request,
        ipmi_response_t response,
        ipmi_data_len_t data_len,
        ipmi_context_t context);

/** @brief The get channel access IPMI command.
 *
 *  @param[in] netfn
 *  @param[in] cmd
 *  @param[in] request
 *  @param[in,out] response
 *  @param[out] data_len
 *  @param[in] context
 *
 *  @return IPMI_CC_OK on success, non-zero otherwise.
 */
ipmi_ret_t ipmi_get_channel_access(
        ipmi_netfn_t netfn,
        ipmi_cmd_t cmd,
        ipmi_request_t request,
        ipmi_response_t response,
        ipmi_data_len_t data_len,
        ipmi_context_t context);

/** @brief The get channel info IPMI command.
 *
 *  @param[in] netfn
 *  @param[in] cmd
 *  @param[in] request
 *  @param[in,out] response
 *  @param[out] data_len
 *  @param[in] context
 *
 *  @return IPMI_CC_OK on success, non-zero otherwise.
 */
ipmi_ret_t ipmi_app_channel_info(
        ipmi_netfn_t netfn,
        ipmi_cmd_t cmd,
        ipmi_request_t request,
        ipmi_response_t response,
        ipmi_data_len_t data_len,
        ipmi_context_t context);

/** @brief Implementation of get channel cipher suites command
 *
 *  @param[in] netfn - Net Function
 *  @param[in] cmd - Command
 *  @param[in] request - Request pointer
 *  @param[in,out] response - Response pointer
 *  @param[in,out] data_len - Data Length
 *  @param[in] context - Context
 *
 *  @return IPMI_CC_OK on success, non-zero otherwise.
 */
ipmi_ret_t getChannelCipherSuites(ipmi_netfn_t netfn,
                                  ipmi_cmd_t cmd,
                                  ipmi_request_t request,
                                  ipmi_response_t response,
                                  ipmi_data_len_t data_len,
                                  ipmi_context_t context);

namespace cipher
{

static constexpr auto defaultChannelNumber = 1;
static constexpr auto listTypeMask = 0x80;
static constexpr auto listCipherSuite = 0x80;
static constexpr auto listIndexMask = 0x3F;
static constexpr auto respSize = 16;

using Json = nlohmann::json;
static constexpr auto configFile =
    "/usr/share/ipmi-providers/cipher_list.json";
static constexpr auto cipher = "cipher";
static constexpr auto stdCipherSuite = 0xC0;
static constexpr auto oemCipherSuite = 0xC1;
static constexpr auto oem = "oemiana";
static constexpr auto auth = "authentication";
static constexpr auto integrity = "integrity";
static constexpr auto integrityTag = 0x40;
static constexpr auto conf = "confidentiality";
static constexpr auto confTag = 0x80;

} //namespace cipher

/** @struct GetChannelCipherRequest
 *
 *  IPMI payload for Get Channel Cipher Suites command request
 */
struct GetChannelCipherRequest
{
    uint8_t channelNumber;      //!< Channel Number
    uint8_t payloadType;        //!< Payload type number
    uint8_t listIndex;          //!< List Index
} __attribute__((packed));

/** @struct GetChannelCipherRespHeader
 *
 *  IPMI payload for Get Channel Cipher Suites command response header
 */
struct GetChannelCipherRespHeader
{
    uint8_t channelNumber;      //!< Channel Number
} __attribute__((packed));


