#include "libpldm/pdr.h"

#include "common/utils.hpp"

#include <filesystem>

#include <gtest/gtest.h>

namespace fs = std::filesystem;
using namespace pldm;
using namespace pldm::utils;

TEST(EntityAssociation, addObjectPathEntityAssociations1)
{
    pldm_entity entities[41]{};

    entities[0].entity_type = 45;
    entities[0].entity_container_id = 0;

    entities[1].entity_type = 64;
    entities[1].entity_container_id = 1;

    entities[2].entity_type = 67;
    entities[2].entity_container_id = 2;
    entities[3].entity_type = 67;
    entities[3].entity_container_id = 2;

    entities[4].entity_type = 135;
    entities[4].entity_container_id = 3;
    entities[5].entity_type = 135;
    entities[5].entity_container_id = 3;
    entities[6].entity_type = 135;
    entities[6].entity_container_id = 3;
    entities[7].entity_type = 135;
    entities[7].entity_container_id = 3;

    auto tree = pldm_entity_association_tree_init();

    auto l1 = pldm_entity_association_tree_add(tree, &entities[0], 1, nullptr,
                                               PLDM_ENTITY_ASSOCIAION_PHYSICAL);

    auto l2 = pldm_entity_association_tree_add(tree, &entities[1], 1, l1,
                                               PLDM_ENTITY_ASSOCIAION_PHYSICAL);

    auto l3a = pldm_entity_association_tree_add(
        tree, &entities[2], 0, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
    auto l3b = pldm_entity_association_tree_add(
        tree, &entities[3], 1, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL);

    auto l4a = pldm_entity_association_tree_add(
        tree, &entities[4], 0, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
    auto l4b = pldm_entity_association_tree_add(
        tree, &entities[5], 1, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);

    auto l5a = pldm_entity_association_tree_add(
        tree, &entities[6], 0, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
    auto l5b = pldm_entity_association_tree_add(
        tree, &entities[7], 1, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);

    EntityAssociations entityAssociations = {
        {l1, l2}, {l2, l3a, l3b}, {l3a, l4a, l4b}, {l3b, l5a, l5b}};

    ObjectPathMaps retObjectMaps = {
        {"/xyz/openbmc_project/inventory/chassis1", l1},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1", l2},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm0", l3a},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm1", l3b},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm0/cpu0", l4a},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm0/cpu1", l4b},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm1/cpu0", l5a},
        {"/xyz/openbmc_project/inventory/chassis1/motherboard1/dcm1/cpu1", l5b},
    };

    ObjectPathMaps objPathMap;
    updateEntityAssociation(entityAssociations, tree, objPathMap);

    EXPECT_EQ(objPathMap.size(), retObjectMaps.size());

    int index = 0;
    for (auto& obj : objPathMap)
    {
        if (retObjectMaps.contains(obj.first))
        {
            index++;
            pldm_entity entity = pldm_entity_extract(obj.second);
            pldm_entity retEntity =
                pldm_entity_extract(retObjectMaps[obj.first]);
            EXPECT_EQ(entity.entity_type, retEntity.entity_type);
            EXPECT_EQ(entity.entity_instance_num,
                      retEntity.entity_instance_num);
            EXPECT_EQ(pldm_entity_node_get_remote_container_id(obj.second),
                      pldm_entity_node_get_remote_container_id(
                          retObjectMaps[obj.first]));
        }
    }
    EXPECT_EQ(index, retObjectMaps.size());
    pldm_entity_association_tree_destroy(tree);
}
