#pragma once
#include "smbios_mdrv2.hpp"

#include <xyz/openbmc_project/Association/Definitions/server.hpp>
#include <xyz/openbmc_project/Inventory/Connector/Embedded/server.hpp>
#include <xyz/openbmc_project/Inventory/Decorator/LocationCode/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/PCIeSlot/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/server.hpp>

#include <cstdint>
#include <map>
#include <unordered_set>

namespace phosphor
{

namespace smbios
{

using PCIeSlot =
    sdbusplus::xyz::openbmc_project::Inventory::Item::server::PCIeSlot;
using PCIeGeneration = sdbusplus::xyz::openbmc_project::Inventory::Item::
    server::PCIeSlot::Generations;
using PCIeType = sdbusplus::xyz::openbmc_project::Inventory::Item::server::
    PCIeSlot::SlotTypes;
using embedded =
    sdbusplus::xyz::openbmc_project::Inventory::Connector::server::Embedded;
using location =
    sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::LocationCode;
using item = sdbusplus::xyz::openbmc_project::Inventory::server::Item;
using association =
    sdbusplus::xyz::openbmc_project::Association::server::Definitions;

class Pcie :
    sdbusplus::server::object_t<PCIeSlot, location, embedded, item, association>
{
  public:
    Pcie() = delete;
    Pcie(const Pcie&) = delete;
    Pcie& operator=(const Pcie&) = delete;
    Pcie(Pcie&&) = delete;
    Pcie& operator=(Pcie&&) = delete;
    ~Pcie() = default;

    Pcie(sdbusplus::bus::bus& bus, const std::string& objPath,
         const uint8_t& pcieId, uint8_t* smbiosTableStorage,
         const std::string& motherboard) :
        sdbusplus::server::object_t<PCIeSlot, location, embedded, item,
                                    association>(bus, objPath.c_str()),
        pcieNum(pcieId), storage(smbiosTableStorage),
        motherboardPath(motherboard)
    {
        pcieInfoUpdate();
    }

    void pcieInfoUpdate();

  private:
    uint8_t pcieNum;
    uint8_t* storage;
    std::string motherboardPath;

    struct SystemSlotInfo
    {
        uint8_t type;
        uint8_t length;
        uint16_t handle;
        uint8_t slotDesignation;
        uint8_t slotType;
        uint8_t slotDataBusWidth;
        uint8_t currUsage;
        uint8_t slotLength;
        uint16_t slotID;
        uint8_t characteristics1;
        uint8_t characteristics2;
        uint16_t segGroupNum;
        uint8_t busNum;
        uint8_t deviceNum;
    } __attribute__((packed));

    void pcieGeneration(const uint8_t type);
    void pcieType(const uint8_t type);
    void pcieLaneSize(const uint8_t width);
    void pcieIsHotPluggable(const uint8_t characteristics);
    void pcieLocation(const uint8_t slotDesignation, const uint8_t structLen,
                      uint8_t* dataIn);
};

static const std::unordered_set<uint8_t> pcieSmbiosType = {
    0x09, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1c,
    0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xa5,
    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1,
    0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd,
    0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6};

// Definition follow smbios spec DSP0134 3.4.0
static const std::map<uint8_t, PCIeGeneration> pcieGenerationTable = {
    {0x09, PCIeGeneration::Unknown}, {0x14, PCIeGeneration::Gen3},
    {0x15, PCIeGeneration::Gen3},    {0x16, PCIeGeneration::Gen3},
    {0x17, PCIeGeneration::Gen3},    {0x18, PCIeGeneration::Gen1},
    {0x19, PCIeGeneration::Gen1},    {0x1a, PCIeGeneration::Gen1},
    {0x1b, PCIeGeneration::Gen1},    {0x1c, PCIeGeneration::Gen1},
    {0x1d, PCIeGeneration::Gen3},    {0x1e, PCIeGeneration::Gen3},
    {0x1f, PCIeGeneration::Gen2},    {0x20, PCIeGeneration::Gen3},
    {0x21, PCIeGeneration::Gen1},    {0x22, PCIeGeneration::Gen1},
    {0x23, PCIeGeneration::Gen1},    {0x24, PCIeGeneration::Gen4},
    {0x25, PCIeGeneration::Gen5},    {0x26, PCIeGeneration::Unknown},
    {0x27, PCIeGeneration::Unknown}, {0x28, PCIeGeneration::Unknown},
    {0x29, PCIeGeneration::Unknown}, {0xa5, PCIeGeneration::Gen1},
    {0xa6, PCIeGeneration::Gen1},    {0xa7, PCIeGeneration::Gen1},
    {0xa8, PCIeGeneration::Gen1},    {0xa9, PCIeGeneration::Gen1},
    {0xaa, PCIeGeneration::Gen1},    {0xab, PCIeGeneration::Gen2},
    {0xac, PCIeGeneration::Gen2},    {0xad, PCIeGeneration::Gen2},
    {0xae, PCIeGeneration::Gen2},    {0xaf, PCIeGeneration::Gen2},
    {0xb0, PCIeGeneration::Gen2},    {0xb1, PCIeGeneration::Gen3},
    {0xb2, PCIeGeneration::Gen3},    {0xb3, PCIeGeneration::Gen3},
    {0xb4, PCIeGeneration::Gen3},    {0xb5, PCIeGeneration::Gen3},
    {0xb6, PCIeGeneration::Gen3},    {0xb8, PCIeGeneration::Gen4},
    {0xb9, PCIeGeneration::Gen4},    {0xba, PCIeGeneration::Gen4},
    {0xbb, PCIeGeneration::Gen4},    {0xbc, PCIeGeneration::Gen4},
    {0xbd, PCIeGeneration::Gen4},    {0xbe, PCIeGeneration::Gen5},
    {0xbf, PCIeGeneration::Gen5},    {0xc0, PCIeGeneration::Gen5},
    {0xc1, PCIeGeneration::Gen5},    {0xc2, PCIeGeneration::Gen5},
    {0xc3, PCIeGeneration::Gen5},    {0xc4, PCIeGeneration::Unknown},
    {0xc5, PCIeGeneration::Unknown}, {0xc6, PCIeGeneration::Unknown}};

static const std::map<uint8_t, PCIeType> pcieTypeTable = {
    {0x09, PCIeType::OEM},       {0x14, PCIeType::M_2},
    {0x15, PCIeType::M_2},       {0x16, PCIeType::M_2},
    {0x17, PCIeType::M_2},       {0x18, PCIeType::Unknown},
    {0x19, PCIeType::Unknown},   {0x1a, PCIeType::Unknown},
    {0x1b, PCIeType::Unknown},   {0x1c, PCIeType::Unknown},
    {0x1d, PCIeType::Unknown},   {0x1e, PCIeType::Unknown},
    {0xa8, PCIeType::Unknown},   {0xa9, PCIeType::Unknown},
    {0x1F, PCIeType::U_2},       {0x20, PCIeType::U_2},
    {0x21, PCIeType::Mini},      {0x22, PCIeType::Mini},
    {0x23, PCIeType::Mini},      {0x24, PCIeType::U_2},
    {0x25, PCIeType::U_2},       {0x26, PCIeType::OCP3Small},
    {0x27, PCIeType::OCP3Large}, {0x28, PCIeType::Unknown},
    {0x29, PCIeType::Unknown},   {0xa5, PCIeType::Unknown},
    {0xa6, PCIeType::Unknown},   {0xa7, PCIeType::Unknown},
    {0xa8, PCIeType::Unknown},   {0xa9, PCIeType::Unknown},
    {0xaa, PCIeType::Unknown},   {0xab, PCIeType::Unknown},
    {0xac, PCIeType::Unknown},   {0xad, PCIeType::Unknown},
    {0xae, PCIeType::Unknown},   {0xaf, PCIeType::Unknown},
    {0xb0, PCIeType::Unknown},   {0xb1, PCIeType::Unknown},
    {0xb2, PCIeType::Unknown},   {0xb3, PCIeType::Unknown},
    {0xb4, PCIeType::Unknown},   {0xb5, PCIeType::Unknown},
    {0xb6, PCIeType::Unknown},   {0xb8, PCIeType::Unknown},
    {0xb9, PCIeType::Unknown},   {0xba, PCIeType::Unknown},
    {0xbb, PCIeType::Unknown},   {0xbc, PCIeType::Unknown},
    {0xbd, PCIeType::Unknown},   {0xbe, PCIeType::Unknown},
    {0xbf, PCIeType::Unknown},   {0xc0, PCIeType::Unknown},
    {0xc1, PCIeType::Unknown},   {0xc2, PCIeType::Unknown},
    {0xc3, PCIeType::Unknown},   {0xc4, PCIeType::Unknown},
    {0xc5, PCIeType::Unknown},   {0xc6, PCIeType::Unknown}};

const std::map<uint8_t, size_t> pcieLanesTable = {
    {0x08, 1}, {0x09, 2}, {0xa, 4}, {0xb, 8}, {0xc, 12}, {0xd, 16}, {0xe, 32}};

}; // namespace smbios

}; // namespace phosphor
