#pragma once

#include "message_handler.hpp"

#include <vector>

namespace sol
{

namespace command
{

/** @brief SOL Payload Handler
 *
 *  This command is used for activating and deactivating a payload type under a
 *  given IPMI session. The UDP Port number for SOL is the same as the port that
 *  was used to establish the IPMI session.
 *
 *  @param[in] inPayload - Request data for the command.
 *  @param[in] handler - Reference to the message handler.
 *
 *  @return Response data for the command.
 */
std::vector<uint8_t> payloadHandler(const std::vector<uint8_t>& inPayload,
                                    const message::Handler& handler);

constexpr uint8_t netfnTransport = 0x0C;
constexpr uint8_t solActivatingCmd = 0x20;

/** @struct ActivatingRequest
 *
 *  IPMI payload for SOL Activating command.
 */
struct ActivatingRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
    uint8_t sessionState : 4; //!< SOL session state.
    uint8_t reserved : 4;     //!< Reserved.
#endif

#if BYTE_ORDER == BIG_ENDIAN
    uint8_t reserved : 4;     //!< Reserved.
    uint8_t sessionState : 4; //!< SOL session state.
#endif

    uint8_t payloadInstance; //!< Payload instance.
    uint8_t majorVersion;    //!< SOL format major version
    uint8_t minorVersion;    //!< SOL format minor version
} __attribute__((packed));

/** @brief SOL Activating Command.
 *
 *  This command provides a mechanism for the BMC to notify a remote application
 *  that a SOL payload is activating on another channel.The request message is a
 *  message that is asynchronously generated by the BMC. The BMC will not wait
 *  for a response from the remote console before dropping the serial connection
 *  to proceed with SOL, therefore the remote console does not need to respond
 *  to this command.
 *
 *  @param[in] payloadInstance - SOL payload instance.
 *  @param[in] sessionID - IPMI session ID.
 */
void activating(uint8_t payloadInstance, uint32_t sessionID);

/** @enum Parameter
 *
 *  SOL parameters are volatile, they are initialized by the SOL manager.
 *  They can be read using Get SOL configuration parameters command and updated
 *  using Set SOL configuration parameters command.
 */
enum class Parameter
{
    PROGRESS,       //!< Set In Progress.
    ENABLE,         //!< SOL Enable.
    AUTHENTICATION, //!< SOL Authentication.
    ACCUMULATE,     //!< Character Accumulate Interval & Send Threshold.
    RETRY,          //!< SOL Retry.
    NVBITRATE,      //!< SOL non-volatile bit rate.
    VBITRATE,       //!< SOL volatile bit rate.
    CHANNEL,        //!< SOL payload channel.
    PORT,           //!< SOL payload port.
};

constexpr uint8_t progressMask = 0x03;
constexpr uint8_t enableMask = 0x01;

/** @struct Auth
 *
 *  SOL authentication parameter.
 */
struct Auth
{
#if BYTE_ORDER == LITTLE_ENDIAN
    uint8_t privilege : 4; //!< SOL privilege level.
    uint8_t reserved : 2;  //!< Reserved.
    uint8_t auth : 1;      //!< Force SOL payload Authentication.
    uint8_t encrypt : 1;   //!< Force SOL payload encryption.
#endif

#if BYTE_ORDER == BIG_ENDIAN
    uint8_t encrypt : 1;   //!< Force SOL payload encryption.
    uint8_t auth : 1;      //!< Force SOL payload Authentication.
    uint8_t reserved : 2;  //!< Reserved.
    uint8_t privilege : 4; //!< SOL privilege level.
#endif
} __attribute__((packed));

/** @struct Accumulate
 *
 *  Character accumulate interval & Character send threshold.
 */
struct Accumulate
{
    uint8_t interval;  //!< Character accumulate interval.
    uint8_t threshold; //!< Character send threshold.
} __attribute__((packed));

constexpr uint8_t retryCountMask = 0x07;

/** @struct Retry
 *
 *  SOL retry count and interval.
 */
struct Retry
{
#if BYTE_ORDER == LITTLE_ENDIAN
    uint8_t count : 3;    //!< SOL retry count.
    uint8_t reserved : 5; //!< Reserved.
#endif

#if BYTE_ORDER == BIG_ENDIAN
    uint8_t reserved : 5; //!< Reserved.
    uint8_t count : 3;    //!< SOL retry count.
#endif

    uint8_t interval; //!< SOL retry interval.
} __attribute__((packed));

constexpr uint8_t ipmiCCParamNotSupported = 0x80;
constexpr uint8_t ipmiCCInvalidSetInProgress = 0x81;
constexpr uint8_t ipmiCCWriteReadParameter = 0x82;
constexpr uint8_t ipmiCCReadWriteParameter = 0x83;
constexpr uint8_t parameterRevision = 0x11;

/** @struct SetConfParamsRequest
 *
 *  IPMI payload for Set SOL configuration parameters command request.
 */
struct SetConfParamsRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
    uint8_t channelNumber : 4; //!< Channel number.
    uint8_t reserved : 4;      //!< Reserved.
#endif

#if BYTE_ORDER == BIG_ENDIAN
    uint8_t reserved : 4;      //!< Reserved.
    uint8_t channelNumber : 4; //!< Channel number.
#endif

    uint8_t paramSelector; //!< Parameter selector.
    union
    {
        uint8_t value;         //!< Represents one byte SOL parameters.
        struct Accumulate acc; //!< Character accumulate values.
        struct Retry retry;    //!< Retry values.
        struct Auth auth;      //!< Authentication parameters.
    };
} __attribute__((packed));

/** @struct SetConfParamsResponse
 *
 *  IPMI payload for Set SOL configuration parameters command response.
 */
struct SetConfParamsResponse
{
    uint8_t completionCode; //!< Completion code.
} __attribute__((packed));

/** @brief Set SOL configuration parameters command.
 *
 *  @param[in] inPayload - Request data for the command.
 *  @param[in] handler - Reference to the message handler.
 *
 *  @return Response data for the command.
 */
std::vector<uint8_t> setConfParams(const std::vector<uint8_t>& inPayload,
                                   const message::Handler& handler);

/** @struct GetConfParamsRequest
 *
 *  IPMI payload for Get SOL configuration parameters command request.
 */
struct GetConfParamsRequest
{
#if BYTE_ORDER == LITTLE_ENDIAN
    uint8_t channelNum : 4;  //!< Channel number.
    uint8_t reserved : 3;    //!< Reserved.
    uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision
#endif

#if BYTE_ORDER == BIG_ENDIAN
    uint8_t getParamRev : 1; //!< Get parameter or Get parameter revision
    uint8_t reserved : 3;    //!< Reserved.
    uint8_t channelNum : 4;  //!< Channel number.
#endif

    uint8_t paramSelector; //!< Parameter selector.
    uint8_t setSelector;   //!< Set selector.
    uint8_t blockSelector; //!< Block selector.
} __attribute__((packed));

/** @struct GetConfParamsResponse
 *
 *  IPMI payload for Get SOL configuration parameters command response.
 */
struct GetConfParamsResponse
{
    uint8_t completionCode; //!< Completion code.
    uint8_t paramRev;       //!< Parameter revision.
} __attribute__((packed));

/** @brief Get SOL configuration parameters command.
 *
 *  @param[in] inPayload - Request data for the command.
 *  @param[in] handler - Reference to the message handler.
 *
 *  @return Response data for the command.
 */
std::vector<uint8_t> getConfParams(const std::vector<uint8_t>& inPayload,
                                   const message::Handler& handler);

} // namespace command

} // namespace sol
