#pragma once
#include <drogon/plugins/Plugin.h>
#include <drogon/utils/monitoring/Registry.h>
#include <drogon/utils/monitoring/Collector.h>
#include <memory>
#include <mutex>
namespace drogon
{
namespace plugin
{
class DROGON_EXPORT PromExporter
    : public drogon::Plugin<PromExporter>,
      public std::enable_shared_from_this<PromExporter>,
      public drogon::monitoring::Registry
{
  public:
    PromExporter()
    {
    }
    void initAndStart(const Json::Value &config) override;
    void shutdown() override
    {
    }
    ~PromExporter() override
    {
    }
    void registerCollector(
        const std::shared_ptr<drogon::monitoring::CollectorBase> &collector)
        override;
    std::shared_ptr<drogon::monitoring::CollectorBase> getCollector(
        const std::string &name) const noexcept(false);
    template <typename T>
    std::shared_ptr<drogon::monitoring::Collector<T>> getCollector(
        const std::string &name) const
    {
        return std::dynamic_pointer_cast<drogon::monitoring::Collector<T>>(
            getCollector(name));
    }
  private:
    mutable std::mutex mutex_;
    std::unordered_map<std::string,
                       std::shared_ptr<drogon::monitoring::CollectorBase>>
        collectors_;
    std::string path_{"/metrics"};
    std::string exportMetrics();
};
}  
}  