#include "custom_dbus.hpp"

namespace pldm
{
namespace dbus
{
void CustomDBus::setLocationCode(const std::string& path, std::string value)
{
    if (!location.contains(path))
    {
        location.emplace(path,
                         std::make_unique<LocationIntf>(
                             pldm::utils::DBusHandler::getBus(), path.c_str()));
    }

    location.at(path)->locationCode(value);
}

std::optional<std::string>
    CustomDBus::getLocationCode(const std::string& path) const
{
    if (location.contains(path))
    {
        return location.at(path)->locationCode();
    }

    return std::nullopt;
}

void CustomDBus::setSoftwareVersion(const std::string& path,
                                    std::string version,
                                    const std::string& inventoryPath)
{
    if (!softwareVersion.contains(path))
    {
        softwareVersion.emplace(
            path, std::make_unique<SoftwareVersionIntf>(
                      pldm::utils::DBusHandler::getBus(), path.c_str()));
        softwareVersion.at(path)->purpose(
            sdbusplus::xyz::openbmc_project::Software::server::Version::
                VersionPurpose::Other);
    }
    softwareVersion.at(path)->version(version);

    if (!inventoryPath.empty())
    {
        if (!softwareAssociations.contains(path))
        {
            softwareAssociations.emplace(
                path, std::make_unique<AssociationIntf>(
                          pldm::utils::DBusHandler::getBus(), path.c_str()));
        }
        std::vector<std::tuple<std::string, std::string, std::string>>
            associations;
        associations.emplace_back("software_related", "software",
                                  inventoryPath);
        softwareAssociations.at(path)->associations(associations);
    }
}

std::optional<std::string>
    CustomDBus::getSoftwareVersion(const std::string& path) const
{
    if (softwareVersion.contains(path))
    {
        return softwareVersion.at(path)->version();
    }

    return std::nullopt;
}

void CustomDBus::assignSoftwareVersionPath(const std::string& versionStr,
                                           uint8_t eid,
                                           const std::string& inventoryPath)
{
    std::string softwarePath = "/xyz/openbmc_project/software/";

    std::string softwareName = "";
    if (!inventoryPath.empty())
    {
        size_t pos = inventoryPath.find_last_of('/');
        if (pos != std::string::npos && pos + 1 < inventoryPath.size())
        {
            softwareName = inventoryPath.substr(pos + 1);
        }
    }

    if (!softwareName.empty())
    {
        softwarePath += softwareName;
    }
    else
    {
        softwarePath += std::to_string(eid);
    }
    setSoftwareVersion(softwarePath, versionStr, inventoryPath);
}

} // namespace dbus
} // namespace pldm
