#pragma once

#include <experimental/filesystem>
#include <functional>
#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 specific 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
