#pragma once

#include "config.h"

#include "dbus.hpp"
#include "interfaces.hpp"

#include <any>
#include <experimental/filesystem>
#include <map>
#include <sdbusplus/bus.hpp>
#ifdef USE_POLICY_INTERFACE
#include "policy_table.hpp"
#endif

namespace ibm
{
namespace logging
{

/**
 * @class Manager
 *
 * This class hosts IBM specific interfaces for the error logging
 * entry objects.  It watches for interfaces added and removed
 * signals to know when to create and delete objects.  Handling the
 * xyz.openbmc_project.Logging service going away is done at the
 * systemd service level where this app will be stopped too.
 */
class Manager
{
  public:
    Manager() = delete;
    ~Manager() = default;
    Manager(const Manager&) = delete;
    Manager& operator=(const Manager&) = delete;
    Manager(Manager&&) = delete;
    Manager& operator=(Manager&&) = delete;

    /**
     * Constructor
     *
     * @param[in] bus - the D-Bus bus object
     */
    explicit Manager(sdbusplus::bus::bus& bus);

  private:
    using EntryID = uint32_t;
    using InterfaceMap = std::map<InterfaceType, std::any>;
    using EntryMap = std::map<EntryID, InterfaceMap>;

    using ObjectList = std::vector<std::any>;
    using InterfaceMapMulti = std::map<InterfaceType, ObjectList>;
    using EntryMapMulti = std::map<EntryID, InterfaceMapMulti>;

    /**
     * Deletes the entry and any child entries with
     * the specified ID.
     *
     * @param[in] id - the entry ID
     */
    void erase(EntryID id);

    /**
     * The callback for an interfaces added signal
     *
     * Creates the IBM interfaces for the log entry
     * that was just created.
     *
     * @param[in] msg - the sdbusplus message
     */
    void interfaceAdded(sdbusplus::message::message& msg);

    /**
     * The callback for an interfaces removed signal
     *
     * Removes the IBM interfaces for the log entry
     * that was just removed.
     *
     * @param[in] msg - the sdbusplus message
     */
    void interfaceRemoved(sdbusplus::message::message& msg);

    /**
     * Creates the IBM interfaces for all existing error log
     * entries.
     */
    void createAll();

    /**
     * Creates the IBM interface(s) for a single new error log.
     *
     * Any interfaces that require serialization will be created
     * and serialized here.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log
     */
    void create(const std::string& objectPath,
                const DbusInterfaceMap& interfaces);

    /**
     * Creates the IBM interface(s) for a single error log after
     * the application is restarted.
     *
     * Interfaces that were persisted will be restored from their
     * previously saved filesystem data.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log
     */
    void createWithRestore(const std::string& objectPath,
                           const DbusInterfaceMap& interfaces);

    /**
     * Creates the IBM interfaces for a single error log that
     * do not persist across app restarts.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log
     */
    void createObject(const std::string& objectPath,
                      const DbusInterfaceMap& interfaces);

    /**
     * Returns the error log timestamp property value from
     * the passed in map of all interfaces and property names/values
     * on an error log D-Bus object.
     *
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log.
     *
     * @return uint64_t - the timestamp
     */
    uint64_t getLogTimestamp(const DbusInterfaceMap& interfaces);

    /**
     * Returns the filesystem directory to use for persisting
     * information about a particular error log.
     *
     * @param[in] id - the error log ID
     * @return path - the directory path
     */
    std::experimental::filesystem::path getSaveDir(EntryID id);

    /**
     * Returns the directory to use to save the callout information in
     *
     * @param[in] id - the error log ID
     *
     * @return path - the directory path
     */
    std::experimental::filesystem::path getCalloutSaveDir(EntryID id);

    /**
     * Returns the D-Bus object path to use for a callout D-Bus object.
     *
     * @param[in] objectPath - the object path for the error log
     * @param[in] calloutNum - the callout instance number
     *
     * @return path - the object path to use for a callout object
     */
    std::string getCalloutObjectPath(const std::string& objectPath,
                                     uint32_t calloutNum);

    /**
     * Creates the IBM policy interface for a single error log
     * and saves it in the list of interfaces.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] properties - the xyz.openbmc_project.Logging.Entry
     *                         properties
     */
#ifdef USE_POLICY_INTERFACE
    void createPolicyInterface(const std::string& objectPath,
                               const DbusPropertyMap& properties);
#endif

    /**
     * Creates D-Bus objects for any callouts in an error log
     * that map to an inventory object with an Asset interface.
     *
     * The created object will also host the Asset interface.
     *
     * A callout object path would look like:
     * /xyz/openbmc_project/logging/entry/5/callouts/0.
     *
     * Any objects created are serialized so the asset information
     * can always be restored.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log.
     */
    void createCalloutObjects(const std::string& objectPath,
                              const DbusInterfaceMap& interfaces);

    /**
     * Restores callout objects for a particular error log that
     * have previously been saved by reading their data out of
     * the filesystem using Cereal.
     *
     * @param[in] objectPath - object path of the error log
     * @param[in] interfaces - map of all interfaces and properties
     *                         on a phosphor-logging error log.
     */
    void restoreCalloutObjects(const std::string& objectPath,
                               const DbusInterfaceMap& interfaces);

    /**
     * Returns the entry ID for a log
     *
     * @param[in] objectPath - the object path of the log
     *
     * @return uint32_t - the ID
     */
    inline uint32_t getEntryID(const std::string& objectPath)
    {
        std::experimental::filesystem::path path(objectPath);
        return std::stoul(path.filename());
    }

    /**
     * Adds an interface object to the entries map
     *
     * @param[in] objectPath - the object path of the log
     * @param[in] type - the interface type being added
     * @param[in] object - the interface object
     */
    void addInterface(const std::string& objectPath, InterfaceType type,
                      std::any& object);

    /**
     * Adds an interface to a child object, which is an object that
     * relates to the main ...logging/entry/X object but has a different path.
     * The object is stored in the childEntries map.
     *
     * There can be multiple instances of a child object per type per
     * logging object.
     *
     * @param[in] objectPath - the object path of the log
     * @param[in] type - the interface type being added.
     * @param[in] object - the interface object
     */
    void addChildInterface(const std::string& objectPath, InterfaceType type,
                           std::any& object);

    /**
     * The sdbusplus bus object
     */
    sdbusplus::bus::bus& bus;

    /**
     * The match object for interfacesAdded
     */
    sdbusplus::bus::match_t addMatch;

    /**
     * The match object for interfacesRemoved
     */
    sdbusplus::bus::match_t removeMatch;

    /**
     * A map of the error log IDs to their IBM interface objects.
     * There may be multiple interfaces per ID.
     */
    EntryMap entries;

    /**
     * A map of the error log IDs to their interface objects which
     * are children of the logging objects.
     *
     * These objects have the same lifespan as their parent objects.
     *
     * There may be multiple interfaces per ID, and also multiple
     * interface instances per interface type.
     */
    EntryMapMulti childEntries;

#ifdef USE_POLICY_INTERFACE
    /**
     * The class the wraps the IBM error logging policy table.
     */
    policy::Table policies;
#endif
};
} // namespace logging
} // namespace ibm
