#pragma once
#include "callback.hpp"

namespace phosphor
{
namespace dbus
{
namespace monitoring
{

/**
 * @class ResolveCallout
 * @brief Resolves error logs with the associated callout
 *
 * Resolves a log by setting its Resolved property
 * to true.
 */
class ResolveCallout : public Callback
{
    public:

        ResolveCallout() = delete;
        ~ResolveCallout() = default;
        ResolveCallout(const ResolveCallout&) = delete;
        ResolveCallout& operator=(const ResolveCallout&) = delete;
        ResolveCallout(ResolveCallout&&) = default;
        ResolveCallout& operator=(ResolveCallout&&) = default;

        /**
         * @brief constructor
         *
         * @param[in] callout - The callout whose errors need to be resolved.
         *                      Normally an inventory path.
         */
        explicit ResolveCallout(const std::string& callout) :
                callout(callout) {}

        /**
         * @brief Callback interface to resolve errors
         *
         * Resolves all error log entries that are associated
         * with the callout.
         */
        void operator()() override;

    private:

        /**
         * @brief Resolves a single error log entry
         *
         * param[in] entry - the object path of the error log entry
         */
        void resolve(const std::string& entry);

        /**
         * @brief The object path of the callout, typically an inventory path
         */
        std::string callout;
};


} // namespace monitoring
} // namespace dbus
} // namespace phosphor
