#pragma once
#include <drogon/plugins/Plugin.h>
#include <drogon/HttpRequest.h>
#include <vector>
namespace drogon
{
namespace plugin
{
using RedirectorHandler =
    std::function<bool(const drogon::HttpRequestPtr &,
                       std::string &,  
                       std::string &,  
                       bool &)>;       
using PathRewriteHandler = std::function<bool(const drogon::HttpRequestPtr &)>;
using ForwardHandler = std::function<void(const drogon::HttpRequestPtr &)>;
class DROGON_EXPORT Redirector : public drogon::Plugin<Redirector>,
                                 public std::enable_shared_from_this<Redirector>
{
  public:
    Redirector()
    {
    }
    void initAndStart(const Json::Value &config) override;
    void shutdown() override;
    void registerRedirectHandler(RedirectorHandler &&handler)
    {
        handlers_.emplace_back(std::move(handler));
    }
    void registerRedirectHandler(const RedirectorHandler &handler)
    {
        handlers_.emplace_back(handler);
    }
    void registerPathRewriteHandler(PathRewriteHandler &&handler)
    {
        pathRewriteHandlers_.emplace_back(std::move(handler));
    }
    void registerPathRewriteHandler(const PathRewriteHandler &handler)
    {
        pathRewriteHandlers_.emplace_back(handler);
    }
    void registerForwardHandler(ForwardHandler &&handler)
    {
        forwardHandlers_.emplace_back(std::move(handler));
    }
    void registerForwardHandler(const ForwardHandler &handler)
    {
        forwardHandlers_.emplace_back(handler);
    }
  private:
    std::vector<RedirectorHandler> handlers_;
    std::vector<PathRewriteHandler> pathRewriteHandlers_;
    std::vector<ForwardHandler> forwardHandlers_;
};
}  
}  