#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,
                                    std::shared_ptr<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,
                                   std::shared_ptr<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,
                                   std::shared_ptr<message::Handler>& handler);

} // namespace command

} // namespace sol
