#pragma once

#include <map>

#include "dump_utils.hpp"
#include "watch.hpp"
#include "config.h"

namespace phosphor
{
namespace dump
{
namespace core
{
using Watch = phosphor::dump::inotify::Watch;
using UserMap = phosphor::dump::inotify::UserMap;

/** workaround: Watches for IN_CREATE event for the
 *  ubi filesystem based systemd-coredump core path
 *  Refer openbmc/issues/#2287 for more details.
 */
#ifdef UBI_CORE_FILE_WORKAROUND
    static constexpr auto coreFileEvent = IN_CREATE;
#else
    static constexpr auto coreFileEvent = IN_CLOSE_WRITE;
#endif

/** @class Manager
 *  @brief OpenBMC Core manager implementation.
 */
class Manager
{
    public:
        Manager() = delete;
        Manager(const Manager&) = default;
        Manager& operator=(const Manager&) = delete;
        Manager(Manager&&) = delete;
        Manager& operator=(Manager&&) = delete;
        virtual ~Manager() = default;

        /** @brief Constructor to create core watch object.
         *  @param[in] event - Dump manager sd_event loop.
         */
        Manager(const EventPtr& event) :
            eventLoop(event.get()),
            coreWatch(eventLoop,
                      IN_NONBLOCK,
                      coreFileEvent,
                      EPOLLIN,
                      CORE_FILE_DIR,
                      std::bind(
                          std::mem_fn(
                              &phosphor::dump::core::Manager::watchCallback),
                          this, std::placeholders::_1))
        {}

    private:
        /** @brief Helper function for initiating dump request using
         *         D-bus internal create interface.
         *  @param [in] files - Core files list
         */
        void createHelper(const std::vector<std::string>& files);


        /** @brief Implementation of core watch call back
         * @param [in] fileInfo - map of file info  path:event
         */
        void watchCallback(const UserMap& fileInfo);

        /** @brief sdbusplus Dump event loop */
        EventPtr eventLoop;

        /** @brief Core watch object */
        Watch coreWatch;
};

} // namepsace core
} // namespace dump
} // namespace phosphor
