#pragma once

#include <systemd/sd-event.h>

namespace phosphor
{
namespace software
{
namespace manager
{

/** @class Watch
 *
 *  @brief Adds inotify watch on software image upload directory
 *
 *  The inotify watch is hooked up with sd-event, so that on call back,
 *  appropriate actions related to a software image upload can be taken.
 */
class Watch
{
    public:
        /** @brief ctor - hook inotify watch with sd-event
         *
         *  @param[in] loop - sd-event object
         *  @param[in] imageCallback - The callback function for processing
         *                             the image
         */
        Watch(sd_event* loop,
              std::function<int(std::string&)> imageCallback);

        Watch(const Watch&) = delete;
        Watch& operator=(const Watch&) = delete;
        Watch(Watch&&) = delete;
        Watch& operator=(Watch&&) = delete;

        /** @brief dtor - remove inotify watch and close fd's
         */
        ~Watch();

    private:
        /** @brief sd-event callback
         *
         *  @param[in] s - event source, floating (unused) in our case
         *  @param[in] fd - inotify fd
         *  @param[in] revents - events that matched for fd
         *  @param[in] userdata - pointer to Watch object
         *  @returns 0 on success, -1 on fail
         */
        static int callback(sd_event_source* s,
                            int fd,
                            uint32_t revents,
                            void* userdata);

        /** @brief image upload directory watch descriptor */
        int wd = -1;

        /** @brief inotify file descriptor */
        int fd = -1;

        /** @brief The callback function for processing the image. */
        std::function<int(std::string&)> imageCallback;
};

} // namespace manager
} // namespace software
} // namespace phosphor
