#include "pldm_base_cmd.hpp"

#include "pldm_cmd_helper.hpp"

#include <string>

constexpr uint8_t PLDM_ENTITY_ID = 8;
constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
constexpr uint8_t PLDM_LOCAL_INSTANCE_ID = 0;

using namespace std;

/*
 * Main function that handles the GetPLDMTypes response callback via mctp
 *
 */
void getPLDMTypes(vector<std::string>&& /*args*/)
{
    // Create and encode the request message
    vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
                               sizeof(MCTP_MSG_TYPE_PLDM) +
                               sizeof(PLDM_ENTITY_ID));
    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());

    // Encode the get_types request message
    uint8_t instanceId = PLDM_LOCAL_INSTANCE_ID;
    auto returnCode = encode_get_types_req(instanceId, request);
    if (returnCode)
    {
        cerr << "Failed to encode request msg for GetPLDMType : RC = "
             << returnCode << endl;
        return;
    }
    cout << "Encoded request succesfully : RC = " << returnCode << endl;

    // Insert the PLDM message type and EID at the begining of the request msg.
    requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
    requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);

    cout << "Request Message:" << endl;
    printBuffer(requestMsg);

    // Create the response message
    vector<uint8_t> responseMsg;

    // Compares the response with request packet on first socket recv() call.
    // If above condition is qualified then, reads the actual response from
    // the socket to output buffer responseMsg.
    returnCode = mctpSockSendRecv(requestMsg, responseMsg);
    if (!returnCode)
    {
        cout << "Socket recv() successful : RC = " << returnCode << endl;
        cout << "Response Message : " << endl;
        printBuffer(responseMsg);
    }
    else
    {
        cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
        return;
    }
}

/*
 * Main function that handles the GetPLDMVersion response callback via mctp
 *
 */
void getPLDMVersion(vector<std::string>&& args)
{
    // Create a request packet
    std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
                                    PLDM_GET_VERSION_REQ_BYTES);
    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());

    uint8_t pldmType = 0x0;

    if (!args[1].c_str())
    {
        cout << "Mandatory argument PLDM Command Type not provided!" << endl;
        cout << "Run pldmtool --help for more information" << endl;
        return;
    }

    if (!strcasecmp(args[1].c_str(), "base"))
    {
        cout << "PLDM Type requested : " << args[1] << endl;
        pldmType = PLDM_BASE;
    }
    else if (!strcasecmp(args[1].c_str(), "bios"))
    {
        cout << "PLDM Type requested : " << args[1] << endl;
        pldmType = PLDM_BIOS;
    }
    else if (!strcasecmp(args[1].c_str(), "fru"))
    {
        cout << "PLDM Type requested : " << args[1] << endl;
        pldmType = PLDM_FRU;
    }
    else if (!strcasecmp(args[1].c_str(), "oem"))
    {
        cout << "PLDM Type requested : " << args[1] << endl;
        pldmType = PLDM_OEM;
    }
    else
    {
        cerr << "Unsupported pldm command type OR not supported yet : "
             << args[1] << endl;
        return;
    }

    uint8_t instanceId = PLDM_LOCAL_INSTANCE_ID;
    uint32_t transferHandle = 0x0;
    transfer_op_flag opFlag = PLDM_GET_FIRSTPART;

    // encode the get_version request
    auto returnCode = encode_get_version_req(instanceId, transferHandle, opFlag,
                                             pldmType, request);
    if (returnCode)
    {
        cerr << "Failed to encode request msg for GetPLDMVersion. RC = "
             << returnCode << endl;
        return;
    }
    cout << "Encoded request succesfully : RC = " << returnCode << endl;

    // Insert the PLDM message type and EID at the begining of the request msg.
    requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
    requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);

    cout << "Request Message:" << endl;
    printBuffer(requestMsg);

    // Create the response message
    vector<uint8_t> responseMsg;

    // Compares the response with request packet on first socket recv() call.
    // If above condition is qualified then, reads the actual response from
    // the socket to output buffer responseMsg.
    returnCode = mctpSockSendRecv(requestMsg, responseMsg);
    if (!returnCode)
    {
        cout << "Socket recv() successful : RC = " << returnCode << endl;
        cout << "Response Message:" << endl;
        printBuffer(responseMsg);
    }
    else
    {
        cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
        return;
    }
}

/*
 * Main function that handles the PLDM raw command response callback via mctp
 *
 */
void handleRawOp(vector<std::string>&& args)
{
    // Minimu 3 bytes of header data needs to passed. else its a invalid request
    if (size(args) < 3)
    {
        cerr << "Not enough arguments passed."
                " Minimum, need to pass PLDM header raw data"
             << endl;
        return;
    }

    // Create a request packet and initialize it
    std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
    requestMsg.clear();

    // Read the raw data passed in the command line
    // Form request message from the raw data passed
    for (auto&& rawByte : args)
    {
        requestMsg.insert(requestMsg.end(), stoi(rawByte, nullptr, 16));
    }

    // Validating the payload raw data based on pldm command type
    uint8_t pldmCmd = requestMsg[2];
    switch (pldmCmd)
    {
        case PLDM_GET_PLDM_VERSION:
            if (size(requestMsg) !=
                (sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES))
            {
                cerr << "Not enough raw data provided." << endl;
                cerr << "Total length can be = 3 bytes of header + 6 bytes"
                        " for payload. Please refer spec for details"
                     << endl;
                return;
            }
            break;
        case PLDM_GET_TID:
        case PLDM_GET_PLDM_TYPES:
            if (size(requestMsg) != sizeof(pldm_msg_hdr))
            {
                cerr << "Total length can be = 3 bytes of header + 0 bytes"
                        " for payload. Please refer spec for details"
                     << endl;
                return;
            }
            break;
        case PLDM_GET_PLDM_COMMANDS:
            if (size(requestMsg) !=
                sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES)
            {
                cerr << "Total length can be = 3 bytes of header + 5 bytes"
                        " for payload. Please refer spec for details"
                     << endl;
                return;
            }
            break;
        case PLDM_SET_STATE_EFFECTER_STATES:
            // payload size depends on comp_effecter_count
            // if count=1 then, request size will be 8 bytes including header
            // if count=9 then, request size will be 19 bytes including header
            if ((size(requestMsg) < 8) ||
                (size(requestMsg) >
                 sizeof(pldm_msg_hdr) +
                     PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES))
            {
                cerr << "Total length can be = 3 bytes of header + min/max 8/19"
                        " bytes for payload. Please refer spec for details"
                     << endl;
                return;
            }
            break;
        default:
            cerr << "Command Not supported/implemented : " << args[2] << endl;
            cerr << "Contact backend Team" << endl;
            return;
    }

    // Add the MCTP type and PLDM entity id at the end
    requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
    requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);

    cout << "Request Message" << endl;
    printBuffer(requestMsg);

    // Create the response message
    vector<uint8_t> responseMsg;

    // Compares the response with request packet on first socket recv() call.
    // If above condition is qualified then, reads the actual response from
    // the socket to output buffer responseMsg.
    int returnCode = mctpSockSendRecv(requestMsg, responseMsg);
    if (!returnCode)
    {
        cout << "Socket recv() successful : RC = " << returnCode << endl;
        cout << "Response Message:" << endl;
        printBuffer(responseMsg);
    }
    else
    {
        cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
        return;
    }
}
