#pragma once
#include <drogon/HttpController.h>
#include <drogon/utils/coroutine.h>
#include "../services/dbControllService.h"
using namespace drogon;
class WebController : public drogon::HttpController<WebController> {
public:
    METHOD_LIST_BEGIN
    ADD_METHOD_TO(WebController::loginView, "/login", Get, "WebFilter");
    ADD_METHOD_TO(WebController::loginSubmit, "/login", Post, "WebFilter");
    ADD_METHOD_TO(WebController::logout, "/logout", Get, "WebFilter");
    ADD_METHOD_TO(WebController::homeView, "/", Get, "WebFilter");
    ADD_METHOD_TO(WebController::agentsList, "/agents", Get, "WebFilter");
    ADD_METHOD_TO(WebController::trackersList, "/trackers", Get, "WebFilter");
    ADD_METHOD_TO(WebController::mapView, "/map", Get, "WebFilter");
    ADD_METHOD_TO(WebController::addAgent, "/agents/add", Post, "WebFilter");
    ADD_METHOD_TO(WebController::addTracker, "/trackers/add", Post, "WebFilter");
    ADD_METHOD_TO(WebController::updateAgent, "/agents/update", Post, "WebFilter");
    ADD_METHOD_TO(WebController::updateTracker, "/trackers/update", Post, "WebFilter");
    METHOD_LIST_END
    drogon::Task<HttpResponsePtr> loginView(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> loginSubmit(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> logout(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> homeView(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> agentsList(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> trackersList(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> mapView(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> addAgent(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> addTracker(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> updateAgent(HttpRequestPtr req);
    drogon::Task<HttpResponsePtr> updateTracker(HttpRequestPtr req);
private:
    CdbControllService dbService_;
    bool checkSession(const HttpRequestPtr& req);
    bool isAdmin(const HttpRequestPtr& req);
};