#include "pldm_base_cmd.hpp"

#include "pldm_cmd_helper.hpp"

#include <libpldm/base.h>

#ifdef OEM_IBM
#include <libpldm/oem/ibm/file_io.h>
#include <libpldm/oem/ibm/host.h>
#endif

#include <string>

namespace pldmtool
{

namespace base
{

namespace
{

using namespace pldmtool::helper;

std::vector<std::unique_ptr<CommandInterface>> commands;
const std::map<const char*, pldm_supported_types> pldmTypes{
    {"base", PLDM_BASE},         {"smbios", PLDM_SMBIOS},
    {"platform", PLDM_PLATFORM}, {"bios", PLDM_BIOS},
    {"fru", PLDM_FRU},           {"firmware update", PLDM_FWUP},
    {"RDE", PLDM_RDE},           {"file transfer", PLDM_FILE},
    {"oem", PLDM_OEM},
};

const std::map<const char*, pldm_supported_commands> pldmBaseCmds{
    {"SetTID", PLDM_SET_TID},
    {"GetTID", PLDM_GET_TID},
    {"GetPLDMVersion", PLDM_GET_PLDM_VERSION},
    {"GetPLDMTypes", PLDM_GET_PLDM_TYPES},
    {"GetPLDMCommands", PLDM_GET_PLDM_COMMANDS},
    {"SelectPLDMVersion", PLDM_SELECT_PLDM_VERSION},
    {"NegotiateTransferParameters", PLDM_NEGOTIATE_TRANSFER_PARAMETERS},
    {"MultipartSend", PLDM_MULTIPART_SEND},
    {"MultipartReceive", PLDM_MULTIPART_RECEIVE},
    {"GetMultipartTransferSupport", PLDM_GET_MULTIPART_TRANSFER_SUPPORT}};

const std::map<const char*, pldm_smbios_commands> pldmSmbiosCmds{
    {"GetSMBIOSStructureTableMetadata",
     PLDM_SMBIOS_CMD_GET_SMBIOS_STRUCTURE_TABLE_METADATA},
    {"SetSMBIOSStructureTableMetadata",
     PLDM_SMBIOS_CMD_SET_SMBIOS_STRUCTURE_TABLE_METADATA},
    {"GetSMBIOSStructureTable", PLDM_SMBIOS_CMD_GET_SMBIOS_STRUCTURE_TABLE},
    {"SetSMBIOSStructureTable", PLDM_SMBIOS_CMD_SET_SMBIOS_STRUCTURE_TABLE},
    {"GetSMBIOSStructureByType", PLDM_SMBIOS_CMD_GET_SMBIOS_STRUCTURE_BY_TYPE},
    {"GetSMBIOSStructureByHandle",
     PLDM_SMBIOS_CMD_GET_SMBIOS_STRUCTURE_BY_HANDLE}};

const std::map<const char*, pldm_bios_commands> pldmBiosCmds{
    {"GetBIOSTable", PLDM_GET_BIOS_TABLE},
    {"SetBIOSTable", PLDM_SET_BIOS_TABLE},
    {"UpdateBIOSTable", PLDM_UPDATE_BIOS_TABLE},
    {"GetBIOSTableTags", PLDM_GET_BIOS_TABLE_TAGS},
    {"SetBIOSTableTags", PLDM_SET_BIOS_TBALE_TAGS},
    {"AcceptBIOSAttributesPendingValues",
     PLDM_ACCEPT_BIOS_ATTRIBUTES_PENDING_VALUES},
    {"SetBIOSAttributeCurrentValue", PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE},
    {"GetBIOSAttributeCurrentValueByHandle",
     PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE},
    {"GetBIOSAttributePendingValueByHandle",
     PLDM_GET_BIOS_ATTRIBUTE_PENDING_VALUE_BY_HANDLE},
    {"GetBIOSAttributeCurrentValueByType",
     PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_TYPE},
    {"GetBIOSAttributePendingValueByType",
     PLDM_GET_BIOS_ATTRIBUTE_PENDING_VALUE_BY_TYPE},
    {"GetDateTime", PLDM_GET_DATE_TIME},
    {"SetDateTime", PLDM_SET_DATE_TIME},
    {"GetBIOSStringTableStringType", PLDM_GET_BIOS_STRING_TABLE_STRING_TYPE},
    {"SetBIOSStringTableStringType", PLDM_SET_BIOS_STRING_TABLE_STRING_TYPE}};

const std::map<const char*, pldm_platform_commands> pldmPlatformCmds{
    {"GetTerminusUID", PLDM_GET_TERMINUS_UID},
    {"SetEventReceiver", PLDM_SET_EVENT_RECEIVER},
    {"GetEventReceiver", PLDM_GET_EVENT_RECEIVER},
    {"PlatformEventMessage", PLDM_PLATFORM_EVENT_MESSAGE},
    {"PollForPlatformEventMessage", PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE},
    {"EventMessageSupported", PLDM_EVENT_MESSAGE_SUPPORTED},
    {"EventMessageBufferSize", PLDM_EVENT_MESSAGE_BUFFER_SIZE},
    {"SetNumericSensorEnable", PLDM_SET_NUMERIC_SENSOR_ENABLE},
    {"GetSensorReading", PLDM_GET_SENSOR_READING},
    {"GetSensorThresholds", PLDM_GET_SENSOR_THRESHOLDS},
    {"SetSensorThresholds", PLDM_SET_SENSOR_THRESHOLDS},
    {"RestoreSensorThresholds", PLDM_RESTORE_SENSOR_THRESHOLDS},
    {"GetSensorHysteresis", PLDM_GET_SENSOR_HYSTERESIS},
    {"SetSensorHysteresis", PLDM_SET_SENSOR_HYSTERESIS},
    {"InitNumericSensor", PLDM_INIT_NUMERIC_SENSOR},
    {"SetStateSensorEnables", PLDM_SET_STATE_SENSOR_ENABLES},
    {"GetStateSensorReadings", PLDM_GET_STATE_SENSOR_READINGS},
    {"InitStateSensor", PLDM_INIT_STATE_SENSOR},
    {"SetNumericEffecterEnable", PLDM_SET_NUMERIC_EFFECTER_ENABLE},
    {"SetNumericEffecterValue", PLDM_SET_NUMERIC_EFFECTER_VALUE},
    {"GetNumericEffecterValue", PLDM_GET_NUMERIC_EFFECTER_VALUE},
    {"SetStateEffecterEnables", PLDM_SET_STATE_EFFECTER_ENABLES},
    {"SetStateEffecterStates", PLDM_SET_STATE_EFFECTER_STATES},
    {"GetStateEffecterStates", PLDM_GET_STATE_EFFECTER_STATES},
    {"GetPLDMEventLogInfo", PLDM_GET_PLDM_EVENT_LOG_INFO},
    {"EnablePLDMEventLogging", PLDM_ENABLE_PLDM_EVENT_LOGGING},
    {"ClearPLDMEventLog", PLDM_CLEAR_PLDM_EVENT_LOG},
    {"GetPLDMEventLogTimestamp", PLDM_GET_PLDM_EVENT_LOG_TIMESTAMP},
    {"SetPLDMEventLogTimestamp", PLDM_SET_PLDM_EVENT_LOG_TIMESTAMP},
    {"ReadPLDMEventLog", PLDM_READ_PLDM_EVENT_LOG},
    {"GetPLDMEventLogPolicyInfo", PLDM_GET_PLDM_EVENT_LOG_POLICY_INFO},
    {"SetPLDMEventLogPolicy", PLDM_SET_PLDM_EVENT_LOG_POLICY},
    {"FindPLDMEventLogEntry", PLDM_FIND_PLDM_EVENT_LOG_ENTRY},
    {"GetPDRRepositoryInfo", PLDM_GET_PDR_REPOSITORY_INFO},
    {"GetPDR", PLDM_GET_PDR},
    {"FindPDR", PLDM_FIND_PDR},
    {"RunInitAgent", PLDM_RUN_INIT_AGENT},
    {"GetPDRRepositorySignature", PLDM_GET_PDR_REPOSITORY_SIGNATURE}};

const std::map<const char*, pldm_fru_commands> pldmFruCmds{
    {"GetFRURecordTableMetadata", PLDM_GET_FRU_RECORD_TABLE_METADATA},
    {"GetFRURecordTable", PLDM_GET_FRU_RECORD_TABLE},
    {"GetFRURecordByOption", PLDM_GET_FRU_RECORD_BY_OPTION},
    {"SetFRURecordTable", PLDM_SET_FRU_RECORD_TABLE},
    {"GetFRURecordByOption", PLDM_GET_FRU_RECORD_BY_OPTION},
    {"ReadFRUDataItem", PLDM_READ_FRU_DATA_ITEM},
    {"WriteFRUDataItem", PLDM_WRITE_FRU_DATA_ITEM},
    {"FindFRUFiles", PLDM_FIND_FRU_FILES},
    {"GetFRUFileMetadata", PLDM_GET_FRU_FILE_METADATA}};

const std::map<const char*, pldm_firmware_update_commands>
    pldmFirmwareUpdateCmds{
        {"QueryDeviceIdentifiers", PLDM_QUERY_DEVICE_IDENTIFIERS},
        {"GetFirmwareParameters", PLDM_GET_FIRMWARE_PARAMETERS},
        {"QueryDownstreamDevices", PLDM_QUERY_DOWNSTREAM_DEVICES},
        {"QueryDownstreamIdentifiers", PLDM_QUERY_DOWNSTREAM_IDENTIFIERS},
        {"GetDownstreamFirmwareParameters",
         PLDM_QUERY_DOWNSTREAM_FIRMWARE_PARAMETERS},
        {"RequestUpdate", PLDM_REQUEST_UPDATE},
        {"GetPackageData", PLDM_GET_PACKAGE_DATA},
        {"GetDeviceMetaData", PLDM_GET_DEVICE_META_DATA},
        {"PassComponentTable", PLDM_PASS_COMPONENT_TABLE},
        {"UpdateComponent", PLDM_UPDATE_COMPONENT},
        {"RequestFirmwareData", PLDM_REQUEST_FIRMWARE_DATA},
        {"TransferComplete", PLDM_TRANSFER_COMPLETE},
        {"VerifyComplete", PLDM_VERIFY_COMPLETE},
        {"ApplyComplete", PLDM_APPLY_COMPLETE},
        {"GetMetaData", PLDM_GET_META_DATA},
        {"ActivateFirmware", PLDM_ACTIVATE_FIRMWARE},
        {"GetStatus", PLDM_GET_STATUS},
        {"CancelUpdateComponent", PLDM_CANCEL_UPDATE_COMPONENT},
        {"CancelUpdate", PLDM_CANCEL_UPDATE},
        {"ActivatePendingComponentImageSet",
         PLDM_ACTIVATE_PENDING_COMPONENT_IMAGE_SET},
        {"ActivatePendingComponentImage",
         PLDM_ACTIVATE_PENDING_COMPONENT_IMAGE},
        {"RequestDownstreamDeviceUpdate",
         PLDM_REQUEST_DOWNSTREAM_DEVICE_UPDATE},
        {"GetComponentOpaqueData", PLDM_GET_COMPONENT_OPAQUE_DATA},
        {"UpdateSecurityRevision", PLDM_UPTATE_SECURITY_REVISION}};

const std::map<const char*, pldm_rde_commands> pldmRdeCmds{
    {"NegotiateRedfishParameters", PLDM_RDE_CMD_NEGOTIATE_REDFISH_PARAMETERS},
    {"NegotiateMediumParameters", PLDM_RDE_CMD_NEGOTIATE_MEDIUM_PARAMETERS},
    {"GetSchemaDictionary", PLDM_RDE_CMD_GET_SCHEMA_DICTIONARY},
    {"GetSchemaURI", PLDM_RDE_CMD_GET_SCHEMA_URI},
    {"GetResourceETag", PLDM_RDE_CMD_GET_RESOURCE_ETAG},
    {"GetOEMCount", PLDM_RDE_CMD_GET_OEM_COUNT},
    {"GetOEMName", PLDM_RDE_CMD_GET_OEM_NAME},
    {"GetRegistryCount", PLDM_RDE_CMD_GET_REGISTRY_COUNT},
    {"GetRegistryDetails", PLDM_RDE_CMD_GET_REGISTRY_DETAILS},
    {"SelectRegistryVersion", PLDM_RDE_CMD_SELECT_REGISTRY_VERSION},
    {"GetMessageRegistry", PLDM_RDE_CMD_GET_MESSAGE_REGISTRY},
    {"GetSchemaFile", PLDM_RDE_CMD_GET_SCHEMA_FILE},
    {"RDEOperationInit", PLDM_RDE_CMD_RDE_OPERATION_INIT},
    {"SupplyCustomRequestParameters",
     PLDM_RDE_CMD_SUPPLY_CUSTOM_REQUEST_PARAMETERS},
    {"RetrieveCustomResponseParameters",
     PLDM_RDE_CMD_RETRIEVE_CUSTOM_RESPONSE_PARAMETERS},
    {"RDEOperationComplete", PLDM_RDE_CMD_RDE_OPERATION_COMPLETE},
    {"RDEOperationStatus", PLDM_RDE_CMD_RDE_OPERATION_STATUS},
    {"RDEOperationKill", PLDM_RDE_CMD_RDE_OPERATION_KILL},
    {"RDEOperationEnumerate", PLDM_RDE_CMD_RDE_OPERATION_ENUMERATE},
    {"RDEMultipartSend", PLDM_RDE_CMD_RDE_MULTIPART_SEND},
    {"RDEMultipartReceive", PLDM_RDE_CMD_RDE_MULTIPART_RECEIVE}};

const std::map<const char*, pldm_file_cmd> pldmFileTransferCmds{
    {"DfOpen", PLDM_FILE_CMD_DF_OPEN},
    {"DfClose", PLDM_FILE_CMD_DF_CLOSE},
    {"DfHeartbeat", PLDM_FILE_CMD_DF_HEARTBEAT},
    {"DfProperties", PLDM_FILE_CMD_DF_PROPERTIES},
    {"DfGetFileAttribute", PLDM_FILE_CMD_DF_GET_FILE_ATTRIBUTE},
    {"DfSetFileAttribute", PLDM_FILE_CMD_DF_SET_FILE_ATTRIBUTE},
    {"DfRead", PLDM_FILE_CMD_DF_READ},
    {"DfFIFOSend", PLDM_FILE_CMD_DF_FIFO_SEND}};

#ifdef OEM_IBM
const std::map<const char*, pldm_host_commands> pldmIBMHostCmds{
    {"GetAlertStatus", PLDM_HOST_GET_ALERT_STATUS}};

const std::map<const char*, pldm_fileio_commands> pldmIBMFileIOCmds{
    {"GetFileTable", PLDM_GET_FILE_TABLE},
    {"ReadFile", PLDM_READ_FILE},
    {"WriteFile", PLDM_WRITE_FILE},
    {"ReadFileInToMemory", PLDM_READ_FILE_INTO_MEMORY},
    {"WriteFileFromMemory", PLDM_WRITE_FILE_FROM_MEMORY},
    {"ReadFileByTypeIntoMemory", PLDM_READ_FILE_BY_TYPE_INTO_MEMORY},
    {"WriteFileByTypeFromMemory", PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY},
    {"NewFileAvailable", PLDM_NEW_FILE_AVAILABLE},
    {"ReadFileByType", PLDM_READ_FILE_BY_TYPE},
    {"WriteFileByType", PLDM_WRITE_FILE_BY_TYPE},
    {"FileAck", PLDM_FILE_ACK}};
#endif

} // namespace

class GetPLDMTypes : public CommandInterface
{
  public:
    ~GetPLDMTypes() override = default;
    GetPLDMTypes() = delete;
    GetPLDMTypes(const GetPLDMTypes&) = delete;
    GetPLDMTypes(GetPLDMTypes&&) = default;
    GetPLDMTypes& operator=(const GetPLDMTypes&) = delete;
    GetPLDMTypes& operator=(GetPLDMTypes&&) = delete;

    using CommandInterface::CommandInterface;

    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
    {
        std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
        auto request = new (requestMsg.data()) pldm_msg;
        auto rc = encode_get_types_req(instanceId, request);
        return {rc, requestMsg};
    }

    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
    {
        pldm_base_get_pldm_types_resp resp{};
        auto rc = decode_pldm_base_get_pldm_types_resp(responsePtr,
                                                       payloadLength, &resp);
        if (rc)
        {
            std::cerr << "Response Message Error: "
                      << "rc=" << rc << ",cc=" << resp.completion_code << "\n";
            return;
        }

        ordered_json data;
        fillCompletionCode(resp.completion_code, data, PLDM_BASE);
        if (resp.completion_code == PLDM_SUCCESS)
        {
            printPLDMTypes(resp.pldm_types, data);
        }

        pldmtool::helper::DisplayInJson(data);
    }

  private:
    void printPLDMTypes(bitfield8_t (&types)[PLDM_MAX_TYPES / 8],
                        ordered_json& data)
    {
        ordered_json jPldmTypes;
        ordered_json jarray;
        for (int i = 0; i < PLDM_MAX_TYPES; i++)
        {
            bitfield8_t b = types[i / 8];
            if (b.byte & (1 << i % 8))
            {
                auto it = std::find_if(
                    pldmTypes.begin(), pldmTypes.end(),
                    [i](const auto& typePair) { return typePair.second == i; });
                if (it != pldmTypes.end())
                {
                    jarray["PLDM Type"] = it->first;
                }
                else
                {
                    jarray["PLDM Type"] = "unknown";
                }
                jarray["PLDM Type Code"] = i;
                jPldmTypes.emplace_back(jarray);
            }
        }
        data["PLDMTypes"] = jPldmTypes;
    }
};

class GetPLDMVersion : public CommandInterface
{
  public:
    ~GetPLDMVersion() override = default;
    GetPLDMVersion() = delete;
    GetPLDMVersion(const GetPLDMVersion&) = delete;
    GetPLDMVersion(GetPLDMVersion&&) = default;
    GetPLDMVersion& operator=(const GetPLDMVersion&) = delete;
    GetPLDMVersion& operator=(GetPLDMVersion&&) = delete;

    explicit GetPLDMVersion(const char* type, const char* name, CLI::App* app) :
        CommandInterface(type, name, app)
    {
        app->add_option("-t,--type", pldmType, "pldm supported type")
            ->required()
            ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
    }
    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
    {
        std::vector<uint8_t> requestMsg(
            sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES);
        auto request = new (requestMsg.data()) pldm_msg;

        auto rc = encode_get_version_req(instanceId, 0, PLDM_GET_FIRSTPART,
                                         pldmType, request);
        return {rc, requestMsg};
    }

    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
    {
        uint8_t cc = 0, transferFlag = 0;
        uint32_t transferHandle = 0;
        ver32_t version;
        auto rc =
            decode_get_version_resp(responsePtr, payloadLength, &cc,
                                    &transferHandle, &transferFlag, &version);
        if (rc != PLDM_SUCCESS)
        {
            std::cerr << "Response Message Error: "
                      << "rc=" << rc << ",cc=" << (int)cc << "\n";
            return;
        }
        ordered_json data;
        fillCompletionCode(cc, data, PLDM_BASE);
        if (cc == PLDM_SUCCESS)
        {
            char buffer[16] = {0};
            pldm_base_ver2str(&version, buffer, sizeof(buffer));
            auto it = std::find_if(pldmTypes.begin(), pldmTypes.end(),
                                   [&](const auto& typePair) {
                                       return typePair.second == pldmType;
                                   });

            if (it != pldmTypes.end())
            {
                data["Response"] = buffer;
            }
        }

        pldmtool::helper::DisplayInJson(data);
    }

  private:
    pldm_supported_types pldmType;
};

class GetTID : public CommandInterface
{
  public:
    ~GetTID() override = default;
    GetTID() = delete;
    GetTID(const GetTID&) = delete;
    GetTID(GetTID&&) = default;
    GetTID& operator=(const GetTID&) = delete;
    GetTID& operator=(GetTID&&) = delete;

    using CommandInterface::CommandInterface;

    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
    {
        std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
        auto request = new (requestMsg.data()) pldm_msg;
        auto rc = encode_get_tid_req(instanceId, request);
        return {rc, requestMsg};
    }

    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
    {
        uint8_t cc = 0;
        uint8_t tid = 0;
        std::vector<bitfield8_t> types(8);
        auto rc = decode_get_tid_resp(responsePtr, payloadLength, &cc, &tid);
        if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
        {
            std::cerr << "Response Message Error: "
                      << "rc=" << rc << ",cc=" << (int)cc << "\n";
            return;
        }
        ordered_json data;
        data["Response"] = static_cast<uint32_t>(tid);
        pldmtool::helper::DisplayInJson(data);
    }
};

class GetPLDMCommands : public CommandInterface
{
  public:
    ~GetPLDMCommands() override = default;
    GetPLDMCommands() = delete;
    GetPLDMCommands(const GetPLDMCommands&) = delete;
    GetPLDMCommands(GetPLDMCommands&&) = default;
    GetPLDMCommands& operator=(const GetPLDMCommands&) = delete;
    GetPLDMCommands& operator=(GetPLDMCommands&&) = delete;

    explicit GetPLDMCommands(const char* type, const char* name,
                             CLI::App* app) : CommandInterface(type, name, app)
    {
        app->add_option("-t,--type", pldmType, "pldm supported type")
            ->required()
            ->transform(CLI::CheckedTransformer(pldmTypes, CLI::ignore_case));
        app->add_option(
            "-d,--data", inputVersion,
            "Set PLDM type version. Which is got from GetPLDMVersion\n"
            "eg: version 1.1.0 then data will be `0x00 0xF0 0xF1 0xF1`\n"
            "(format: alpha update minor major)");
    }

    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
    {
        std::vector<uint8_t> requestMsg(
            sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES);
        auto request = new (requestMsg.data()) pldm_msg;
        ver32_t version{0xFF, 0xFF, 0xFF, 0xFF};
        if (inputVersion.size() != 0)
        {
            if (inputVersion.size() != 4)
            {
                std::cerr << "Invalid version format. "
                          << "\n";
            }
            else
            {
                version.major = inputVersion[3];
                version.minor = inputVersion[2];
                version.update = inputVersion[1];
                version.alpha = inputVersion[0];
            }
        }
        auto rc =
            encode_get_commands_req(instanceId, pldmType, version, request);
        return {rc, requestMsg};
    }

    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
    {
        uint8_t cc = 0;
        std::vector<bitfield8_t> cmdTypes(32);
        auto rc = decode_get_commands_resp(responsePtr, payloadLength, &cc,
                                           cmdTypes.data());
        if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
        {
            std::cerr << "Response Message Error: "
                      << "rc=" << rc << ",cc=" << (int)cc << "\n";
            return;
        }
        printPldmCommands(cmdTypes, pldmType);
    }

  private:
    pldm_supported_types pldmType;
    std::vector<uint8_t> inputVersion;

    template <typename CommandMap>
    void printCommand(CommandMap& commandMap, int i, ordered_json& jarray)
    {
        auto it = std::find_if(
            commandMap.begin(), commandMap.end(),
            [i](const auto& typePair) { return typePair.second == i; });
        if (it != commandMap.end())
        {
            jarray["PLDM Command"] = it->first;
        }
        else
        {
            jarray["PLDM Command"] = "unknown";
        }
        jarray["PLDM Command Code"] = i;
    }

    void printPldmCommands(std::vector<bitfield8_t>& cmdTypes,
                           pldm_supported_types pldmType)
    {
        ordered_json output;
        for (int i = 0; i < PLDM_MAX_CMDS_PER_TYPE; i++)
        {
            ordered_json cmdinfo;
            bitfield8_t b = cmdTypes[i / 8];
            if (b.byte & (1 << i % 8))
            {
                switch (pldmType)
                {
                    case PLDM_BASE:
                        printCommand(pldmBaseCmds, i, cmdinfo);
                        break;
                    case PLDM_SMBIOS:
                        printCommand(pldmSmbiosCmds, i, cmdinfo);
                        break;
                    case PLDM_PLATFORM:
                        printCommand(pldmPlatformCmds, i, cmdinfo);
                        break;
                    case PLDM_BIOS:
                        printCommand(pldmBiosCmds, i, cmdinfo);
                        break;
                    case PLDM_FRU:
                        printCommand(pldmFruCmds, i, cmdinfo);
                        break;
                    case PLDM_FWUP:
                        printCommand(pldmFirmwareUpdateCmds, i, cmdinfo);
                        break;
                    case PLDM_RDE:
                        printCommand(pldmRdeCmds, i, cmdinfo);
                        break;
                    case PLDM_FILE:
                        printCommand(pldmFileTransferCmds, i, cmdinfo);
                        break;
                    case PLDM_OEM:
#ifdef OEM_IBM
                        printCommand(pldmIBMHostCmds, i, cmdinfo);
                        printCommand(pldmIBMFileIOCmds, i, cmdinfo);
                        break;
#endif
                    default:
                        std::map<char*, int> emptyMap;
                        printCommand(emptyMap, i, cmdinfo);
                        break;
                }
                output.emplace_back(cmdinfo);
            }
        }
        pldmtool::helper::DisplayInJson(output);
    }
};

class SetTID : public CommandInterface
{
  public:
    ~SetTID() override = default;
    SetTID() = delete;
    SetTID(const SetTID&) = delete;
    SetTID(SetTID&&) = default;
    SetTID& operator=(const SetTID&) = delete;
    SetTID& operator=(SetTID&&) = delete;

    explicit SetTID(const char* type, const char* name, CLI::App* app) :
        CommandInterface(type, name, app)
    {
        app->add_option("-t,--tid", tid,
                        "The TID to be set.\n"
                        "Special value: 0x00, 0xFF = reserved. \n")
            ->required();
    }
    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
    {
        std::vector<uint8_t> requestMsg(
            sizeof(pldm_msg_hdr) + PLDM_SET_TID_REQ_BYTES);
        auto request = new (requestMsg.data()) pldm_msg;
        auto rc = encode_set_tid_req(instanceId, tid, request);
        if (rc != PLDM_SUCCESS)
        {
            std::cerr << "Failed to encode_set_tid_req, rc = " << rc
                      << std::endl;
        }
        return {rc, requestMsg};
    }
    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
    {
        uint8_t completionCode = pldm_completion_codes::PLDM_SUCCESS;
        if (payloadLength != PLDM_SET_TID_RESP_BYTES)
        {
            completionCode = pldm_completion_codes::PLDM_ERROR_INVALID_LENGTH;
        }
        else
        {
            completionCode = responsePtr->payload[0];
        }
        ordered_json data;
        data["completionCode"] = completionCode;
        pldmtool::helper::DisplayInJson(data);
    }

  private:
    uint8_t tid;
};

void registerCommand(CLI::App& app)
{
    auto base = app.add_subcommand("base", "base type command");
    base->require_subcommand(1);

    auto getPLDMTypes =
        base->add_subcommand("GetPLDMTypes", "get pldm supported types");
    commands.push_back(
        std::make_unique<GetPLDMTypes>("base", "GetPLDMTypes", getPLDMTypes));

    auto getPLDMVersion =
        base->add_subcommand("GetPLDMVersion", "get version of a certain type");
    commands.push_back(std::make_unique<GetPLDMVersion>(
        "base", "GetPLDMVersion", getPLDMVersion));

    auto getPLDMTID = base->add_subcommand("GetTID", "get Terminus ID (TID)");
    commands.push_back(std::make_unique<GetTID>("base", "GetTID", getPLDMTID));

    auto getPLDMCommands = base->add_subcommand(
        "GetPLDMCommands", "get supported commands of pldm type");
    commands.push_back(std::make_unique<GetPLDMCommands>(
        "base", "GetPLDMCommands", getPLDMCommands));

    auto setTID = base->add_subcommand(
        "SetTID", "set the Terminus ID (TID) for a PLDM Terminus.");
    commands.push_back(std::make_unique<SetTID>("base", "SetTID", setTID));
}

} // namespace base
} // namespace pldmtool
