#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
    {
        pldm_base_get_tid_resp resp{};
        auto rc =
            decode_pldm_base_get_tid_resp(responsePtr, payloadLength, &resp);
        if (rc != PLDM_SUCCESS || resp.completion_code != PLDM_SUCCESS)
        {
            std::cerr << "Response Message Error: "
                      << "rc=" << rc << ",cc="
                      << static_cast<int>(resp.completion_code) << "\n";
            return;
        }
        ordered_json data;
        data["Response"] = static_cast<uint32_t>(resp.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.empty())
        {
            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
