#ifndef THIRD_PARTY_GBMCWEB_INCLUDE_WEB_SERVER_MAIN_SETUP_H_
#define THIRD_PARTY_GBMCWEB_INCLUDE_WEB_SERVER_MAIN_SETUP_H_

#include <systemd/sd-daemon.h>

#include <chrono>  // NOLINT
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <thread>  // NOLINT
#include <utility>

// NOLINTBEGIN
#include "absl/base/log_severity.h"
#include "absl/flags/declare.h"
#include "absl/types/optional.h"
#include "boost/asio/thread_pool.hpp"  // NOLINT
#include "g3/event_store.h"
#include "subscription.h"
#include "subscription_impl.h"
#include "subscription_store_impl.h"
#include "bmcweb_config.h"
#include "app.hpp"
#include "app_singleton.hpp"
#include "logging.hpp"
#include "cors_preflight.hpp"
#include "persistent_data.hpp"
#include "request_stats.hpp"
#include "user_monitor.hpp"
#include "webassets.hpp"
#include "interface.hpp"
#include "redfish.hpp"
#include "health.hpp"
#include "tlbmc/credentials/credential_manager.h"
#include "tlbmc/credentials/credential_manager_impl.h"
#include "tlbmc/hal/system_registry.h"
#include "tlbmc/hal/system_registry_impl.h"
#include "tlbmc/redfish/app.h"
#include "managed_store.hpp"
#include "managed_store_types.hpp"
#include "subscription_backend_impl.hpp"

#ifdef BMCWEB_ENABLE_GRPC
#include "absl/flags/flag.h"
#include "absl/log/initialize.h"
#include "absl/log/log.h"
#include "server.h"

// NOLINTEND

// See absl/log/globals.h for detailed instructions
ABSL_DECLARE_FLAG(int, stderrthreshold);
ABSL_DECLARE_FLAG(int, minloglevel);
ABSL_DECLARE_FLAG(absl::optional<int>, httpport);
ABSL_DECLARE_FLAG(int, mtls_grpc_port);
ABSL_DECLARE_FLAG(int, insecure_grpc_port);

// BMCWEB_ENABLE_STATEFUL_BMCWEB:
ABSL_DECLARE_FLAG(absl::optional<bool>, stateful);
ABSL_DECLARE_FLAG(absl::optional<int>, stateful_pending_max);
ABSL_DECLARE_FLAG(absl::optional<int>, stateful_tfixed_sec);
ABSL_DECLARE_FLAG(absl::optional<int>, stateful_tgrace_sec);
ABSL_DECLARE_FLAG(absl::optional<int>, stateful_tlru_sec);
ABSL_DECLARE_FLAG(absl::optional<bool>, request_stats);
ABSL_DECLARE_FLAG(absl::optional<bool>, timetrace);
ABSL_DECLARE_FLAG(absl::optional<uint64_t>, timetrace_size_max);
ABSL_DECLARE_FLAG(absl::optional<bool>, stateful_logs);
ABSL_DECLARE_FLAG(bool, redfish_events);
ABSL_DECLARE_FLAG(bool, testing_events);
ABSL_DECLARE_FLAG(absl::optional<size_t>, redfish_event_store_size);
ABSL_DECLARE_FLAG(absl::optional<bool>, rde_ratelimit);
ABSL_DECLARE_FLAG(absl::optional<int>, rde_errors_max);
ABSL_DECLARE_FLAG(absl::optional<int>, rde_skips_max);
ABSL_DECLARE_FLAG(bool, multi_thread_get);
ABSL_DECLARE_FLAG(bool, enable_tlbmc);
ABSL_DECLARE_FLAG(bool, enable_tlbmc_trace);
ABSL_DECLARE_FLAG(bool, enable_tlbmc_thermal_control);
ABSL_DECLARE_FLAG(bool, enable_fast_sanity);
ABSL_DECLARE_FLAG(std::string, entity_config_location);
ABSL_DECLARE_FLAG(std::string, server_cert_path);
ABSL_DECLARE_FLAG(std::string, server_private_key_path);
ABSL_DECLARE_FLAG(bool, enable_configure_core_count);
ABSL_DECLARE_FLAG(bool, enable_redfish_configure_ifs);
ABSL_DECLARE_FLAG(std::string, smbios_single_host_file_path);
ABSL_DECLARE_FLAG(std::string, smbios_multihost_host_file_path_prefix);

#endif  // BMCWEB_ENABLE_GRPC

#include <memory>
#include <string>

#include "boost/asio/io_context.hpp"  // NOLINT
#include "redfish_devpath_injector.hpp"
#include "google/google_service_nvme.hpp"
#include "google/google_service_root.hpp"
#include "sdbusplus/asio/connection.hpp"

// Default number of Redfish Events stored.
constexpr size_t defaultRedfishEventStoreSize = 1000;

inline void setupSocket(crow::App& app) {
  constexpr uint16_t defaultPort = 18080;
  int listenFd = sd_listen_fds(0);
  uint16_t portNumber = defaultPort;
#ifdef BMCWEB_ENABLE_GRPC
  portNumber = static_cast<uint16_t>(
      absl::GetFlag(FLAGS_httpport).value_or(defaultPort));
#endif

  BMCWEB_LOG_ALWAYS << "setupSocket: defaultPort: " << defaultPort
                    << " portNumber: " << portNumber
                    << " listenFd: " << listenFd;

  if (1 == listenFd) {
    BMCWEB_LOG_INFO << "attempting systemd socket activation";
    if (sd_is_socket_inet(SD_LISTEN_FDS_START, AF_UNSPEC, SOCK_STREAM, 1, 0) !=
        0) {
      BMCWEB_LOG_INFO << "Starting webserver on socket handle "
                      << SD_LISTEN_FDS_START;
      app.socket(SD_LISTEN_FDS_START);
    } else {
      BMCWEB_LOG_ERROR << "bad incoming socket, starting webserver on port "
                       << portNumber;
      app.port(portNumber);
    }
  } else {
    BMCWEB_LOG_INFO << "Starting webserver on port: " << portNumber;
    app.port(portNumber);
  }
}

inline std::shared_ptr<milotic_tlbmc::SystemRegistryImpl>
createSystemRegistryImpl() {
  milotic_tlbmc::SystemRegistryImpl::Config config{};
#ifdef ENABLE_CONFIGURE_CORE_COUNT
  config.bios_config_config =
      std::make_unique<::platforms::gbmc::hal::BiosConfigConfig>();
#endif
  absl::StatusOr<std::shared_ptr<milotic_tlbmc::SystemRegistryImpl>>
      system_registry = milotic_tlbmc::SystemRegistryImpl::Create(config);

  if (!system_registry.ok()) {
    LOG(WARNING) << "Failed to create system registry: "
                 << system_registry.status();
    return nullptr;
  }
  return *system_registry;
}

inline std::shared_ptr<milotic_tlbmc::CredentialManager>
createCredentialManagerImpl(
    const milotic::RedfishServiceConfig& config,
    const milotic_tlbmc::CredentialManagerImpl::CredentialManagerParams*
        custom_params = nullptr) {
  if (custom_params != nullptr) {
    absl::StatusOr<std::unique_ptr<milotic_tlbmc::CredentialManager>>
        credential_manager =
            milotic_tlbmc::CredentialManagerImpl::Create(*custom_params);
    if (!credential_manager.ok()) {
      LOG(WARNING) << "Failed to create credential manager: "
                   << credential_manager.status();
      return nullptr;
    }
    return *std::move(credential_manager);
  }

  milotic_tlbmc::CredentialManagerImpl::CredentialManagerParams params{
      .private_key_path = config.private_key_path,
      .cert_path = config.own_cert_path,
      .owner_verification_cert_path = config.owner_verification_cert_path,
      .owner_verification_config_path = config.owner_verification_config_path,
      .bmc_ssh_trusted_user_ca_keys_path =
          config.bmc_ssh_trusted_user_ca_keys_path,
      .trust_bundle_path = config.trust_bundle_path,
      .trust_bundle_signature_path = config.trust_bundle_signature_path,
      .os_verification_cert_path = config.os_verification_cert_path,
      .os_verification_key_path = config.os_verification_key_path,
      .serial_console_trusted_user_ca_keys_path =
          config.serial_console_trusted_user_ca_keys_path,
      .serial_console_detatched_signature_path =
          config.serial_console_detatched_signature_path,
      .serial_console_access_level_dir = config.serial_console_access_level_dir,
      .syslog_client_conf_override_path =
          config.syslog_client_conf_override_path,
      .syslog_root_cert_path = config.syslog_root_cert_path,
  };
  absl::StatusOr<std::unique_ptr<milotic_tlbmc::CredentialManager>>
      credential_manager = milotic_tlbmc::CredentialManagerImpl::Create(params);
  if (!credential_manager.ok()) {
    LOG(WARNING) << "Failed to create credential manager: "
                 << credential_manager.status();
    return nullptr;
  }
  return *std::move(credential_manager);
}

inline int run() {
  std::shared_ptr<milotic_tlbmc::CredentialManager> credential_manager =
      nullptr;
#ifdef BMCWEB_ENABLE_GRPC
  absl::InitializeLog();

  std::shared_ptr<milotic_tlbmc::SystemRegistry> system_registry =
      createSystemRegistryImpl();
#ifdef ENABLE_CONFIGURE_CORE_COUNT
  absl::Status status = system_registry->SetInitialCoreCounts();
  if (!status.ok()) {
    LOG(WARNING) << "Failed to set initial core counts: " << status;
  }
#endif

  milotic::RedfishServiceConfig secure_service_config;
  secure_service_config.port = absl::GetFlag(FLAGS_mtls_grpc_port);
  secure_service_config.private_key_path =
      absl::GetFlag(FLAGS_server_private_key_path);
  secure_service_config.own_cert_path = absl::GetFlag(FLAGS_server_cert_path);
  secure_service_config.tlbmc_entity_config_location =
      absl::GetFlag(FLAGS_entity_config_location);
  secure_service_config.smbios_single_host_file_path =
      absl::GetFlag(FLAGS_smbios_single_host_file_path);
  secure_service_config.smbios_multihost_host_file_path_prefix =
      absl::GetFlag(FLAGS_smbios_multihost_host_file_path_prefix);
  secure_service_config.multi_thread_get =
      absl::GetFlag(FLAGS_multi_thread_get);
  secure_service_config.enable_tlbmc = absl::GetFlag(FLAGS_enable_tlbmc);
  secure_service_config.generate_testing_events =
      absl::GetFlag(FLAGS_testing_events);
  secure_service_config.enable_fast_sanity =
      absl::GetFlag(FLAGS_enable_fast_sanity);
  secure_service_config.enable_hft_test_sensor = true;
  secure_service_config.enable_tlbmc_trace =
      absl::GetFlag(FLAGS_enable_tlbmc_trace);
  secure_service_config.enable_tlbmc_thermal_control =
      absl::GetFlag(FLAGS_enable_tlbmc_thermal_control);
  secure_service_config.tlbmc_defer_router_registration_and_validation = true;
  secure_service_config.system_registry = system_registry;

  credential_manager = createCredentialManagerImpl(secure_service_config);
  secure_service_config.credential_manager = credential_manager;

  std::unique_ptr<milotic_tlbmc::RedfishApp> tlbmc_app =
      milotic::GrpcRedfishService::CreateTlbmcApp(secure_service_config);
#ifdef ENABLE_LOAS3_VALIDATION
  secure_service_config.check_loas3_policy = true;
  LOG(WARNING) << "check_loas3_policy is enabled";
#endif

  auto crowLogLevel = crow::LogLevel::Debug;
  crow::Logger::setLogLevel(crowLogLevel);
  const auto minAbslLogLevel =
      static_cast<absl::LogSeverity>(absl::GetFlag(FLAGS_minloglevel));
  BMCWEB_LOG_ALWAYS << "=> minAbslLogLevel: "
                    << static_cast<int>(minAbslLogLevel);
  switch (minAbslLogLevel) {
    // unfortunately there is no: absl::LogSeverity::kInfo; so kInfo ->
    // Debug for now.
    case absl::LogSeverity::kInfo:
      crowLogLevel = crow::LogLevel::Debug;
      break;
    case absl::LogSeverity::kWarning:
      crowLogLevel = crow::LogLevel::Warning;
      break;
    case absl::LogSeverity::kError:
      crowLogLevel = crow::LogLevel::Error;
      break;
    case absl::LogSeverity::kFatal:
      crowLogLevel = crow::LogLevel::Critical;
      break;

    default:
      crowLogLevel = crow::LogLevel::Error;
      break;
  }
  BMCWEB_LOG_ALWAYS << "=> crowLogLevel: " << static_cast<int>(crowLogLevel);
  crow::Logger::setLogLevel(crowLogLevel);
#else
  crow::Logger::setLogLevel(crow::LogLevel::Debug);
#endif
  auto io = std::make_shared<boost::asio::io_context>();
  bool allowSessionEmpty = false;
#ifdef BMCWEB_INSECURE_DISABLE_AUTHX
  allowSessionEmpty = true;
#endif
  std::unique_ptr<devpath_plugin::RedfishDevpathInjector> devpath_injector =
      nullptr;
  absl::StatusOr<std::unique_ptr<devpath_plugin::RedfishDevpathInjector>>
      injector = devpath_plugin::RedfishDevpathInjector::Create(
          "/usr/share/redfish_to_uhm_mappings/"
          "redfish_to_uhm_mappings.textproto");
  if (injector.ok()) {
    devpath_injector = std::move(*injector);
    BMCWEB_LOG_ALWAYS << "RedfishDevpathInjector successfully initialized from "
                         "/usr/share/redfish_to_uhm_mappings/"
                         "redfish_to_uhm_mappings.textproto";
  } else {
    BMCWEB_LOG_ERROR << "Failed to initialize RedfishDevpathInjector: "
                     << injector.status().message();
  }
  App app(allowSessionEmpty, io, tlbmc_app.get(), devpath_injector.get());
  crow::globalBmcWebApp = &app;

  std::shared_ptr<sdbusplus::asio::connection> systemBusPtr =
      std::make_shared<sdbusplus::asio::connection>(*io);

#ifdef BMCWEB_ENABLE_GRPC
  BMCWEB_LOG_STATEFUL_ALWAYS << "=> stateful: "
                             << absl::GetFlag(FLAGS_stateful).value_or(false);
#endif

  managedStore::ManagedObjectStoreConfig config;
  // default to the compiler flag:
#ifdef BMCWEB_ENABLE_STATEFUL_BMCWEB
  config.isEnabled = true;
#else
  config.isEnabled = false;
#endif

// request stats config:
#ifdef BMCWEB_ENABLE_GRPC
  {
    const auto& persistentDataConfig = persistent_data::getConfig();
    managedStore::RequestStatsStoreConfig requestStatsConfig;
    requestStatsConfig.enable = false;
    requestStatsConfig.enableRdeRateLimit = false;

    // command line first:
    if (absl::GetFlag(FLAGS_request_stats).has_value()) {
      requestStatsConfig.enable =
          absl::GetFlag(FLAGS_request_stats).value_or(false);
    }

    // enable rde rate limiter
    if (absl::GetFlag(FLAGS_rde_ratelimit).has_value()) {
      requestStatsConfig.enableRdeRateLimit =
          absl::GetFlag(FLAGS_rde_ratelimit).value_or(false);
    }
    if (absl::GetFlag(FLAGS_rde_errors_max).has_value()) {
      requestStatsConfig.rdeDbusErrorThreshold =
          absl::GetFlag(FLAGS_rde_errors_max).value_or(10);
    }
    if (absl::GetFlag(FLAGS_rde_skips_max).has_value()) {
      requestStatsConfig.rdeMaxSkips =
          absl::GetFlag(FLAGS_rde_skips_max).value_or(30);
    } else if (persistentDataConfig.isStatefulEnabled
                   .has_value()) {  // persistent config:
      requestStatsConfig.enable =
          persistentDataConfig.isRequestStatsEnabled.value();
    }
    BMCWEB_LOG_STATEFUL_ALWAYS << "=> request_stats: "
                               << requestStatsConfig.toJson();
    managedStore::RequestStatsStore::initialize(requestStatsConfig);
  }
#endif

// stateful logs:
#ifdef BMCWEB_ENABLE_GRPC
  {
    const auto& persistentDataConfig = persistent_data::getConfig();
    bool enable_stateful_logs = false;
    // command line first:
    if (absl::GetFlag(FLAGS_stateful_logs).has_value()) {
      enable_stateful_logs = absl::GetFlag(FLAGS_stateful_logs).value_or(false);
    } else if (persistentDataConfig.isStatefulLogsEnabled
                   .has_value()) {  // persistent config:
      enable_stateful_logs = persistentDataConfig.isStatefulLogsEnabled.value();
    }
    BMCWEB_LOG_STATEFUL_ALWAYS << "=> stateful_logs flag: "
                               << enable_stateful_logs;
    if (enable_stateful_logs) {
      crow::Logger::enableStatefulLogs();
    }
  }
#endif

// stateful config:
#ifdef BMCWEB_ENABLE_GRPC
  // command line is always higher priority if set:
  if (absl::GetFlag(FLAGS_stateful).has_value()) {
    config.isEnabled = absl::GetFlag(FLAGS_stateful).value();
  } else  // NOLINT
#endif
  {
    // read the persistent data config:
    const auto& persistentDataConfig = persistent_data::getConfig();
    if (persistentDataConfig.isStatefulEnabled.has_value()) {
      config.isEnabled = persistentDataConfig.isStatefulEnabled.value();
    }
  }

#ifdef BMCWEB_ENABLE_GRPC
  // other flags:
  if (absl::GetFlag(FLAGS_stateful_pending_max).has_value()) {
    config.pendingDbusResponsesMax = static_cast<uint64_t>(
        absl::GetFlag(FLAGS_stateful_pending_max).value());
  }
  if (absl::GetFlag(FLAGS_stateful_tfixed_sec).has_value()) {
    config.tfixedThreshold =
        std::chrono::seconds(absl::GetFlag(FLAGS_stateful_tfixed_sec).value());
  }
  if (absl::GetFlag(FLAGS_stateful_tgrace_sec).has_value()) {
    config.tgraceThreshold =
        std::chrono::seconds(absl::GetFlag(FLAGS_stateful_tgrace_sec).value());
  }
  if (absl::GetFlag(FLAGS_stateful_tlru_sec).has_value()) {
    config.tLRUThreshold =
        std::chrono::seconds(absl::GetFlag(FLAGS_stateful_tlru_sec).value());
  }
  if (absl::GetFlag(FLAGS_timetrace).has_value()) {
    config.timetrace = absl::GetFlag(FLAGS_timetrace).value();
  }
  if (absl::GetFlag(FLAGS_timetrace_size_max).has_value()) {
    config.timetrace_size_max = absl::GetFlag(FLAGS_timetrace_size_max).value();
  }
#endif

  BMCWEB_LOG_STATEFUL_ALWAYS << "=> ManagedObjectStoreConfig: "
                             << config.toString();

#ifndef BMCWEB_ENABLE_STATEFUL_BMCWEB
  if (config.isEnabled) {
    BMCWEB_LOG_WARNING
        << "ManagedObjectStore can't be enabled without "
        << "BMCWEB_ENABLE_STATEFUL_BMCWEB; reverting to stateful=0";
    config.isEnabled = false;
  }
#endif  // BMCWEB_ENABLE_STATEFUL_BMCWEB

  setupSocket(app);

  std::unique_ptr<ecclesia::SubscriptionService> subscriptionService = nullptr;

#ifdef BMCWEB_ENABLE_GRPC
  bool enableRedfishEvents = absl::GetFlag(FLAGS_redfish_events);
  size_t number_of_events_stored = defaultRedfishEventStoreSize;
  if (absl::GetFlag(FLAGS_redfish_event_store_size).has_value()) {
    number_of_events_stored =
        absl::GetFlag(FLAGS_redfish_event_store_size).value();
  }

  using ::milotic::GrpcRedfishService;
  using ::milotic::RedfishServiceConfig;

  if (enableRedfishEvents) {
    BMCWEB_LOG_ALWAYS << "Redfish events enabled\n";
    subscriptionService = CreateSubscriptionService(
        milotic::BmcWebBackend::Create(&app),
        ecclesia::CreateSubscriptionStore(),
        ecclesia::CreateEventStore(number_of_events_stored));
  }
#endif
  // ManagedStore should be initialized regardless of whether grpc is enabled
  auto io_worker_threads = std::make_shared<boost::asio::io_context>();
  uint num_workers = std::thread::hardware_concurrency();
  boost::asio::thread_pool worker_threads(num_workers);
  boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
      work_guard_worker_threads(
          boost::asio::make_work_guard(*io_worker_threads));
  boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
      work_guard_main_thread(boost::asio::make_work_guard(*io));
  for (uint i = 0; i < num_workers; ++i) {
    boost::asio::post(worker_threads,
                      [io_worker_threads]() { io_worker_threads->run(); });
  }
  managedStore::InitializeManagedStore(&config, io.get(), io_worker_threads,
                                       subscriptionService.get(),
                                       systemBusPtr.get(), system_registry);

  // Static assets need to be initialized before Authorization, because auth
  // needs to build the whitelist from the static routes
#ifdef BMCWEB_ENABLE_STATIC_HOSTING
  crow::webassets::requestRoutes(app);
#endif

#ifdef BMCWEB_ENABLE_REDFISH
  redfish::RedfishService redfish(app);
#endif

#ifdef BMCWEB_ENABLE_DBUS_REST
  crow::image_upload::requestRoutes(app);
  crow::openbmc_mapper::requestRoutes(app);
#endif

#ifdef BMCWEB_ENABLE_GOOGLE_API
  crow::google_api::setupCredentialManager(credential_manager);
  crow::google_api::requestRoutes(app);
  crow::google_api::requestGoogleNVMeCollection(app);
  crow::google_api::requestGoogleNVMe(app);
  crow::google_api::requestGoogleNVMeController(app);
  crow::google_api::requestGoogleNVMeControllerCollection(app);
  crow::google_api::setupGoogleNVMeFdFetchIOContext(io);
  crow::google_api::requestGoogleNVMeControllerActionIdentify(app);
  crow::google_api::requestGoogleNVMeControllerActionLog(app);
  crow::google_api::requestGoogleNVMeControllerActionCustomNVMeIdentify(app);
  crow::google_api::requestGoogleNVMeControllerActionAdminNonData(app);
  crow::google_api::requestGoogleNVMeControllerActionLockdownInband(app);
#endif

  if (bmcwebInsecureDisableXssPrevention != 0) {
    cors_preflight::requestRoutes(app);
  }

#ifdef BMCWEB_ENABLE_GRPC
#ifdef BMCWEB_ENABLE_INSECURE_GRPC
  std::cerr << "insecure grpc opened!\n";
  RedfishServiceConfig insecure_config{
      .port = absl::GetFlag(FLAGS_insecure_grpc_port),
      .self_signed_key_cert_path = "/var/volatile/self_signed_key_cert2.pem",
      .tlbmc_entity_config_location =
          absl::GetFlag(FLAGS_entity_config_location),
      .smbios_single_host_file_path =
          absl::GetFlag(FLAGS_smbios_single_host_file_path),
      .smbios_multihost_host_file_path_prefix =
          absl::GetFlag(FLAGS_smbios_multihost_host_file_path_prefix),
      .multi_thread_get = absl::GetFlag(FLAGS_multi_thread_get),
      .enable_tlbmc = absl::GetFlag(FLAGS_enable_tlbmc),
      .enable_insecure_server = true,
      .enable_fast_sanity = absl::GetFlag(FLAGS_enable_fast_sanity),
      .enable_tlbmc_thermal_control =
          absl::GetFlag(FLAGS_enable_tlbmc_thermal_control),
      .tlbmc_defer_router_registration_and_validation = true,
      .system_registry = system_registry,
      .credential_manager = credential_manager,
  };
  GrpcRedfishService insecure_grpc_service(
      &app, tlbmc_app.get(), io, io_worker_threads, insecure_config, nullptr);
#endif
  GrpcRedfishService grpc_service(&app, tlbmc_app.get(), io, io_worker_threads,
                                  secure_service_config,
                                  subscriptionService.get());
#endif
  // Register tlBMC append plugins before gBMCWeb plugins
  GrpcRedfishService::RegisterTlbmcRoutesAndValidate(tlbmc_app.get());

// These have to be registered after managedStore initialization
#ifdef BMCWEB_ENABLE_SSL
  BMCWEB_LOG_INFO << "Start Hostname Monitor Service...";
  crow::hostname_monitor::registerHostnameSignal();
#endif

  bmcweb::registerUserRemovedSignal();

#ifdef PLATFORM_PLUGINS_ENABLED
  redfish_plugin::loadPlatformPlugins();
#endif

#ifdef GOOGLE_COMMON_PLUGINS_ENABLED
  redfish_plugin::loadGooglePlugins();
#endif

#ifdef GOOGLE_PLUGINS_INTERNAL_ENABLED
  redfish_plugin::loadGooglePluginsInternal();
#endif

#ifdef HEALTH_POPULATE
  redfish::HealthStatusCache::getInstance();

#ifndef UNIT_TEST_BUILD
  /*
   * This call subscribes to a live D-Bus signal from the HealthMonitor.
   * This directive excludes the live subscription call during the unit test
   * build, allowing the test to verify logic without attempting to create
   * a real signal match which does not exist in the test environment.
   */
  managedStore::GetManagedObjectStore()->subscribeToEntityManagerChange(
      [](const std::string& objPath) {
        redfish::HealthStatusCache::getInstance().getHealthAttributes(objPath);
      });
#endif /* UNIT_TEST_BUILD */
#endif /* HEALTH_POPULATE */

  app.validate();

  sd_notify(0, "READY=1");

  app.run();

// This will block forever, so skipping these in unit test builds
#ifndef UNIT_TEST_BUILD
  io->run();
  io_worker_threads->stop();
  worker_threads.join();
#endif

  return 0;
}

#endif  // THIRD_PARTY_GBMCWEB_INCLUDE_WEB_SERVER_MAIN_SETUP_H_
