#include "smart_router.h"

#include <memory>
#include <string>
#include <string_view>
#include <vector>

#include "absl/container/flat_hash_set.h"
#include "absl/synchronization/mutex.h"
#include "tlbmc/hal/shared_mem/server.h"
#include "app_interface.h"
#include "dbus_utility.hpp" // NOLINT
#include "async_resp.hpp" // NOLINT
#include "http_request.hpp" // NOLINT
#include "routing.hpp"

// DO NOT MODIFY THIS FILE IN GERRIT. THIS FILE SHOULD ONLY BE MODIFIED IN G3

namespace crow {

using ::milotic_tlbmc::SharedMemoryServer;

void SmartRouter::Handle(crow::Request& req,
                         const std::shared_ptr<bmcweb::AsyncResp>& async_resp) {
  boost::urls::url url(req.target());
  // For now only forward GETs to tlbmc.
  if (req.method() != boost::beast::http::verb::get) {
    gbmcweb_router_.handle(req, async_resp);
    return;
  }

  // If the request is not owned by TLBMC, then we will forward it to gBMCWeb.
  if (tlbmc_app_ == nullptr || !IsTlbmcOwnedUrl(url.encoded_path())) {
    gbmcweb_router_.handle(req, async_resp);
    if (tlbmc_app_ != nullptr) {
      SharedMemoryServer::GetInstance().UpdateMetricsRequestCount(false);
    }
    return;
  }

  // Otherwise we prepare for tlbmc to handle it.
  SharedMemoryServer::GetInstance().UpdateMetricsRequestCount(true);
  tlbmc_app_->HandleFromCrowRequest(req, async_resp);
}

std::vector<const std::string*> SmartRouter::GetRoutes(
    const std::string& parent) {
  return gbmcweb_router_.getRoutes(parent);
}

DynamicRule& SmartRouter::NewRuleDynamic(std::string&& rule) {
  return gbmcweb_router_.newRuleDynamic(rule);
}

void SmartRouter::DebugPrint() {
  gbmcweb_router_.debugPrint();
  if (tlbmc_app_ != nullptr) {
    tlbmc_app_->DebugPrint();
  }
}

void SmartRouter::Validate() { gbmcweb_router_.validate(); }

absl::flat_hash_set<std::string> SmartRouter::GetTlbmcOwnedUrls() {
  if (tlbmc_app_ == nullptr) {
    return {};
  }
  return tlbmc_app_->GetOwnedUrls();
}

bool SmartRouter::IsTlbmcOwnedUrl(std::string_view url) {
  absl::MutexLock lock(&tlbmc_owned_urls_mutex_);
  return tlbmc_owned_urls_.contains(url);
}

void SmartRouter::UpdateTlbmcOwnedUrls() {
  absl::MutexLock lock(&tlbmc_owned_urls_mutex_);
  tlbmc_owned_urls_ = GetTlbmcOwnedUrls();
}

}  // namespace crow
