#pragma once

#include <phosphor-logging/log.hpp>
#include "callback.hpp"
#include "format.hpp"

namespace phosphor
{
namespace dbus
{
namespace monitoring
{

/** @class JournalBase
 *  @brief Journal callback implementation.
 *
 *  The journal callback logs the client message and
 *  journal metadata key value pairs as specified by the
 *  client supplied property index.
 */
class JournalBase : public IndexedCallback
{
    public:
        JournalBase() = delete;
        JournalBase(const JournalBase&) = delete;
        JournalBase(JournalBase&&) = default;
        JournalBase& operator=(const JournalBase&) = delete;
        JournalBase& operator=(JournalBase&&) = default;
        virtual ~JournalBase() = default;
        JournalBase(const char* msg, const PropertyIndex& index) :
            IndexedCallback(index), message(msg) {}

        /** @brief Callback interface implementation. */
        void operator()() override;

    private:
        /** @brief Delegate type specific calls to subclasses. */
        virtual void log(
            const char* message,
            const std::string& pathMeta,
            const std::string& path,
            const std::string& propertyMeta,
            const any_ns::any& value) const = 0;

        /** @brief The client provided message to be traced.  */
        const char* message;
};

/** @class Journal
 *  @brief C++ type specific logic for the journal callback.
 *
 *  @tparam T - The C++ type of the property values being traced.
 *  @tparam Severity - The log severity of the log entry.
 */
template <typename T, phosphor::logging::level Severity>
class Journal : public JournalBase
{
    public:
        Journal() = delete;
        Journal(const Journal&) = delete;
        Journal(Journal&&) = default;
        Journal& operator=(const Journal&) = delete;
        Journal& operator=(Journal&&) = default;
        ~Journal() = default;
        Journal(const char* msg, const PropertyIndex& index) :
            JournalBase(msg, index) {}

    private:
        /** @brief log interface implementation. */
        void log(
            const char* message,
            const std::string& pathMeta,
            const std::string& path,
            const std::string& propertyMeta,
            const any_ns::any& value) const override
        {
            phosphor::logging::log<Severity>(
                message,
                phosphor::logging::entry(
                    pathMeta + GetFormat<decltype(pathMeta)>::format,
                    path),
                phosphor::logging::entry(
                    propertyMeta + GetFormat<T>::format,
                    any_ns::any_cast<T>(value)));
        }
};

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
