#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_configure_memory_capacity);
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);
ABSL_DECLARE_FLAG(std::string, smbios_single_host_status_file_path);
ABSL_DECLARE_FLAG(std::string, smbios_multihost_host_status_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.smbios_single_host_status_file_path =
      absl::GetFlag(FLAGS_smbios_single_host_status_file_path);
  secure_service_config.smbios_multihost_host_status_file_path_prefix =
      absl::GetFlag(FLAGS_smbios_multihost_host_status_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),
      .smbios_single_host_status_file_path =
          absl::GetFlag(FLAGS_smbios_single_host_status_file_path),
      .smbios_multihost_host_status_file_path_prefix =
          absl::GetFlag(FLAGS_smbios_multihost_host_status_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_
