#pragma once

#include <experimental/filesystem>
#include <systemd/sd-event.h>
#include <sys/inotify.h>
#include <map>

#include "dump_utils.hpp"

namespace phosphor
{
namespace dump
{
namespace inotify
{

namespace fs = std::experimental::filesystem;

//User specfic call back function input map(path:event) type.
using UserMap = std::map<fs::path, uint32_t>;

//User specific callback function wrapper type.
using UserType = std::function<void(const UserMap&)>;

/** @class Watch
 *
 *  @brief Adds inotify watch on directory.
 *
 *  The inotify watch is hooked up with sd-event, so that on call back,
 *  appropriate actions are taken to collect files from the directory
 *  initialized by the object.
 */
class Watch
{
    public:
        /** @brief ctor - hook inotify watch with sd-event
         *
         *  @param[in] eventObj - Event loop object
         *  @param[in] flags - inotify flags
         *  @param[in] mask  - Mask of events
         *  @param[in] events - Events to be watched
         *  @param[in] path - File path to be watched
         *  @param[in] userFunc - User specific callback fnction wrapper.
         *
         */
        Watch(const EventPtr& eventObj,
              int flags,
              uint32_t mask,
              uint32_t events,
              const fs::path& path,
              UserType userFunc);

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

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

    private:
        /** @brief sd-event callback.
         *  @details Collects the files and event info and call the
         *           appropriate user function for further action.
         *
         *  @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);

        /**  initialize an inotify instance and returns file descriptor */
        int inotifyInit();

        /** @brief inotify flags */
        int flags;

        /** @brief Mask of events */
        uint32_t mask;

        /** @brief Events to be watched */
        uint32_t events;

        /** @brief File path to be watched */
        fs::path path;

        /** @brief dump file directory watch descriptor */
        int wd = -1;

        /** @brief file descriptor manager */
        CustomFd fd;

        /** @brief The user level callback function wrapper */
        UserType userFunc;
};

} // namespace inotify
} // namespace dump
} // namespace phosphor
