#pragma once
#include <functional>
#include <memory>
#include <sdeventplus/source/event.hpp>
#include <sdeventplus/source/io.hpp>
#include <string>

namespace phosphor::certs
{
/** @class Watch
 *
 *  @brief Adds inotify watch on certificate directory
 *
 *  The inotify watch is hooked up with sd-event, so that on call back,
 *  appropriate actions related to a certificate upload can be taken.
 */
class Watch
{
  public:
    using Callback = std::function<void()>;
    /** @brief ctor - hook inotify watch with sd-event
     *
     *  @param[in] loop - sd-event object
     *  @param[in] cb - The callback function for processing
     *                             certificate upload
     */
    Watch(sdeventplus::Event& event, std::string& certFile, Callback cb);
    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();

    /** @brief start watch on the specified path
     */
    void startWatch();

    /** @brief stop watch on the specified path
     */
    void stopWatch();

  private:
    /** @brief certificate upload directory watch descriptor */
    int wd = -1;

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

    /** @brief SDEventPlus IO pointer added to event loop */
    std::unique_ptr<sdeventplus::source::IO> ioPtr = nullptr;

    /** @brief sd-event object */
    sdeventplus::Event& event;

    /** @brief callback method to be called */
    Callback callback;

    /** @brief Certificate directory to watch */
    std::string watchDir;

    /** @brief Certificate file to watch */
    std::string watchFile;

    /** @brief Certificate file with path */
    std::string certFile;
};
} // namespace phosphor::certs
