#include "utils.hpp"

#include <gmock/gmock.h>

namespace utils
{

class MockedUtils : public UtilsInterface
{
  public:
    virtual ~MockedUtils() = default;

    MOCK_CONST_METHOD1(getPSUInventoryPath,
                       std::vector<std::string>(sdbusplus::bus_t& bus));

    MOCK_CONST_METHOD3(getService,
                       std::string(sdbusplus::bus_t& bus, const char* path,
                                   const char* interface));

    MOCK_CONST_METHOD3(getServices,
                       std::vector<std::string>(sdbusplus::bus_t& bus,
                                                const char* path,
                                                const char* interface));

    MOCK_CONST_METHOD1(getVersionId, std::string(const std::string& version));

    MOCK_CONST_METHOD1(getVersion,
                       std::string(const std::string& psuInventoryPath));

    MOCK_CONST_METHOD1(getLatestVersion,
                       std::string(const std::set<std::string>& versions));

    MOCK_CONST_METHOD2(isAssociated, bool(const std::string& psuInventoryPath,
                                          const AssociationList& assocs));

    MOCK_CONST_METHOD5(getPropertyImpl,
                       any(sdbusplus::bus_t& bus, const char* service,
                           const char* path, const char* interface,
                           const char* propertyName));
};

static std::unique_ptr<MockedUtils> utils;
inline const UtilsInterface& getUtils()
{
    if (!utils)
    {
        utils = std::make_unique<MockedUtils>();
    }
    return *utils;
}

inline void freeUtils()
{
    utils.reset();
}

} // namespace utils
