#pragma once

#include <vector>
#include "message_handler.hpp"

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
