#pragma once

#include "types.hpp"

#include <sdbusplus/bus/match.hpp>

#include <bitset>
#include <chrono>

namespace phosphor::power::psu
{

/**
 * @class UtilBase
 * A base class to allow for mocking certain utility functions.
 */
class UtilBase
{
  public:
    virtual ~UtilBase() = default;

    virtual bool getPresence(sdbusplus::bus_t& bus,
                             const std::string& invpath) const = 0;

    virtual void setPresence(sdbusplus::bus_t& bus, const std::string& invpath,
                             bool present, const std::string& name) const = 0;

    virtual void setAvailable(sdbusplus::bus_t& bus, const std::string& invpath,
                              bool available) const = 0;

    virtual void handleChassisHealthRollup(sdbusplus::bus_t& bus,
                                           const std::string& invpath,
                                           bool addRollup) const = 0;
};

const UtilBase& getUtils();

inline bool getPresence(sdbusplus::bus_t& bus, const std::string& invpath)
{
    return getUtils().getPresence(bus, invpath);
}

inline void setPresence(sdbusplus::bus_t& bus, const std::string& invpath,
                        bool present, const std::string& name)
{
    return getUtils().setPresence(bus, invpath, present, name);
}

inline void setAvailable(sdbusplus::bus_t& bus, const std::string& invpath,
                         bool available)
{
    getUtils().setAvailable(bus, invpath, available);
}

inline void handleChassisHealthRollup(sdbusplus::bus_t& bus,
                                      const std::string& invpath,
                                      bool addRollup)
{
    getUtils().handleChassisHealthRollup(bus, invpath, addRollup);
}

class GPIOInterfaceBase
{
  public:
    virtual ~GPIOInterfaceBase() = default;

    virtual int read() = 0;
    virtual void write(int value, std::bitset<32> flags) = 0;
    virtual void toggleLowHigh(const std::chrono::milliseconds& delay) = 0;
    virtual std::string getName() const = 0;
};

} // namespace phosphor::power::psu