#include <drogon/HttpAppFramework.h>
#include <drogon/HttpResponse.h>
#include <drogon/drogon.h>
#include "trantor/utils/Logger.h"
using namespace drogon;
void setupCors()
{
    drogon::app().registerSyncAdvice([](const drogon::HttpRequestPtr &req)
                                         -> drogon::HttpResponsePtr {
        if (req->method() == drogon::HttpMethod::Options)
        {
            auto resp = drogon::HttpResponse::newHttpResponse();
            const auto &origin = req->getHeader("Origin");
            if (!origin.empty())
            {
                resp->addHeader("Access-Control-Allow-Origin", origin);
            }
            const auto &requestMethod =
                req->getHeader("Access-Control-Request-Method");
            if (!requestMethod.empty())
            {
                resp->addHeader("Access-Control-Allow-Methods", requestMethod);
            }
            resp->addHeader("Access-Control-Allow-Credentials", "true");
            const auto &requestHeaders =
                req->getHeader("Access-Control-Request-Headers");
            if (!requestHeaders.empty())
            {
                resp->addHeader("Access-Control-Allow-Headers", requestHeaders);
            }
            return std::move(resp);
        }
        return {};
    });
    drogon::app().registerPostHandlingAdvice(
        [](const drogon::HttpRequestPtr &req,
           const drogon::HttpResponsePtr &resp) -> void {
            const auto &origin = req->getHeader("Origin");
            if (!origin.empty())
            {
                resp->addHeader("Access-Control-Allow-Origin", origin);
            }
            const auto &requestMethod =
                req->getHeader("Access-Control-Request-Method");
            if (!requestMethod.empty())
            {
                resp->addHeader("Access-Control-Allow-Methods", requestMethod);
            }
            resp->addHeader("Access-Control-Allow-Credentials", "true");
            const auto &requestHeaders =
                req->getHeader("Access-Control-Request-Headers");
            if (!requestHeaders.empty())
            {
                resp->addHeader("Access-Control-Allow-Headers", requestHeaders);
            }
        });
}
int main()
{
    app().addListener("0.0.0.0", 8000);
    setupCors();
    app().registerHandler(
        "/hello",
        [](const HttpRequestPtr &req,
           std::function<void(const HttpResponsePtr &)> &&callback) {
            auto resp = HttpResponse::newHttpResponse();
            resp->setBody("Hello from Drogon!");
            LOG_INFO << "Request to /hello from " << req->getPeerAddr().toIp();
            callback(resp);
        },
        {Get, Options});
    app().registerHandler(
        "/echo",
        [](const HttpRequestPtr &req,
           std::function<void(const HttpResponsePtr &)> &&callback) {
            auto resp = HttpResponse::newHttpResponse();
            resp->setBody(std::string("Echo: ").append(req->getBody()));
            LOG_INFO << "Request to /echo from " << req->getPeerAddr().toIp();
            LOG_INFO << "Echo content: " << req->getBody();
            callback(resp);
        },
        {Post, Options});
    app().run();
    return 0;
}