#pragma once

#include "bmcweb_config.h"
#include "g3/event_store.h"
#include "g3/subscription.h"
#include "g3/subscription_impl.h"
#include "g3/subscription_store_impl.h"
#include "tlbmc/central_config/config.h"
#include "tlbmc/configs/entity_config_json_impl.h"
#include "tlbmc/hal/fru_scanner_i2c.h"
#include "tlbmc/hal/sysfs/i2c.h"
#include "tlbmc/redfish/app.h"
#include "tlbmc/redfish/routes/all_routes.h"
#include "tlbmc/store/store_impl.h"
#include "tlbmc/trace/tracer.h"

#include "app.hpp"
#include "app_singleton.hpp"
#include "boost/asio/thread_pool.hpp"
#include "cors_preflight.hpp"
#include "dbus_monitor.hpp"
#include "hostname_monitor.hpp"
#include "ibm/management_console_rest.hpp"
#include "image_upload.hpp"
#include "kvm_websocket.hpp"
#include "login_routes.hpp"
#include "managed_store.hpp"
#include "obmc_console.hpp"
#include "openbmc_dbus_rest.hpp"
#include "plugins/interface.hpp"
#include "redfish.hpp"
#include "redfish_aggregator.hpp"
#include "security_headers.hpp"
#include "ssl_key_handler.hpp"
#include "subscription_backend_impl.hpp"
#include "user_monitor.hpp"
#include "vm_websocket.hpp"
#include "webassets.hpp"

#include <systemd/sd-daemon.h>

#ifdef BMCWEB_ENABLE_GRPC
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/log/globals.h"
#include "absl/log/initialize.h"
#include "absl/log/log.h"
#include "server.h"
#include "tlbmc/hal/shared_mem/server.h"

// See absl/log/globals.h for detailed instructions
ABSL_FLAG(
    int, stderrthreshold, 1,
    "Messages logged at or above this level are directed to stderr in addition to other registered log sinks; default to >= absl::LogSeverity::kWarning");
ABSL_FLAG(
    int, minloglevel, 1,
    "Messages logged at or above this severity are directed to all registered log sinks or skipped otherwise; default to >= absl::LogSeverity::kWarning");
ABSL_FLAG(absl::optional<int>, httpport, absl::nullopt,
          "http port to listen on");
ABSL_FLAG(int, mtls_grpc_port, mTlsGrpcPort, "The secure gRPC port to listen on. Overwrites the compile time flag.");
ABSL_FLAG(int, insecure_grpc_port, insecureGrpcPort, "the insecure gRPC port to listen on. Overwrites the compile time flag.");

// BMCWEB_ENABLE_STATEFUL_BMCWEB:
ABSL_FLAG(
    absl::optional<bool>, stateful, absl::nullopt,
    "enable stateful bmcweb (stateful-bmcweb) execution of incoming redfish requests");
ABSL_FLAG(absl::optional<int>, stateful_pending_max, absl::nullopt,
          "stateful - pendingDbusResponsesMax");
ABSL_FLAG(absl::optional<int>, stateful_tfixed_sec, absl::nullopt,
          "stateful - tfixedThreshold");
ABSL_FLAG(absl::optional<int>, stateful_tgrace_sec, absl::nullopt,
          "stateful - tgraceThreshold");
ABSL_FLAG(absl::optional<int>, stateful_tlru_sec, absl::nullopt,
          "stateful - tLRUThreshold");
ABSL_FLAG(absl::optional<bool>, request_stats, absl::nullopt,
          "enable request stats aggregation & collection");
ABSL_FLAG(absl::optional<bool>, timetrace, absl::nullopt,
          "enable time tracing of requests");
ABSL_FLAG(absl::optional<uint64_t>, timetrace_size_max, absl::nullopt,
          "Maximum number of requests stored in the timetrace in ManagedStore");
ABSL_FLAG(absl::optional<bool>, stateful_logs, absl::nullopt,
          "enable managedStore logs");
ABSL_FLAG(bool, redfish_events, false, "enable redfish-events feature");
ABSL_FLAG(bool, testing_events, false, "enable testing events for Redfish event");
ABSL_FLAG(absl::optional<size_t>, redfish_event_store_size, absl::nullopt,
          "Number of redfish events to store");
ABSL_FLAG(absl::optional<bool>, rde_ratelimit, absl::nullopt,
          "enable rde request rate limiting");
ABSL_FLAG(absl::optional<int>, rde_errors_max, absl::nullopt,
          "Rde dbus error threshold");
ABSL_FLAG(absl::optional<int>, rde_skips_max, absl::nullopt,
          "Number of requests skipped when rate limiting enabled");
ABSL_FLAG(bool, multi_thread_get, enableMultiThreadGet, "Enable multi-thread for Redfish GET");
ABSL_FLAG(bool, enable_tlbmc, enableTlbmc, "Enable tlBMC features");
ABSL_FLAG(bool, enable_tlbmc_trace, enableTlbmcTrace, "Enable tlBMC tracer");
ABSL_FLAG(bool, enable_fast_sanity, enableFastSanity, "Enable Fast-Sanity features");
ABSL_FLAG(std::string, entity_config_location, entityConfigLocation,
          "Entity configuration location.");

#endif // BMCWEB_ENABLE_GRPC

#include <boost/asio/io_context.hpp>
#include <google/google_service_nvme.hpp>
#include <google/google_service_root.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>

#include <exception>
#include <memory>
#include <string>

// 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 int run()
{
#ifdef BMCWEB_ENABLE_GRPC
    absl::InitializeLog();
    milotic::RedfishServiceConfig secure_service_config{
        .port = absl::GetFlag(FLAGS_mtls_grpc_port),
        .tlbmc_entity_config_location = absl::GetFlag(FLAGS_entity_config_location),
        .multi_thread_get = absl::GetFlag(FLAGS_multi_thread_get),
        .enable_tlbmc = absl::GetFlag(FLAGS_enable_tlbmc),
        .generate_testing_events = absl::GetFlag(FLAGS_testing_events),
        .enable_fast_sanity = absl::GetFlag(FLAGS_enable_fast_sanity),
        .enable_tlbmc_trace = absl::GetFlag(FLAGS_enable_tlbmc_trace),
    };
    std::unique_ptr<milotic_tlbmc::RedfishApp> tlbmc_app = milotic::GrpcRedfishService::CreateTlbmcApp(secure_service_config);


    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
    App app(allowSessionEmpty, io, tlbmc_app.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);
        }
        // persistent config:
        else if (persistentDataConfig.isStatefulEnabled.has_value())
        {
            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);
        }
        // persistent config:
        else if (persistentDataConfig.isStatefulLogsEnabled.has_value())
        {
            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
#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

    // 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_KVM
    crow::obmc_kvm::requestRoutes(app);
#endif

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

    // Create EventServiceManager instance and initialize Config
    redfish::EventServiceManager::getInstance();

#ifdef BMCWEB_ENABLE_REDFISH_AGGREGATION
    // Create RedfishAggregator instance and initialize Config

    // Instantiate RedfishAggregator instance when needed,
    // no need at the bootup. So commenting out
    // redfish::RedfishAggregator::getInstance();
#endif
#endif

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

#ifdef BMCWEB_ENABLE_HOST_SERIAL_WEBSOCKET
    crow::obmc_console::requestRoutes(app);
#endif

#ifdef BMCWEB_ENABLE_VM_WEBSOCKET
    crow::obmc_vm::requestRoutes(app);
#endif

#ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
    crow::ibm_mc::requestRoutes(app);
    crow::ibm_mc_lock::Lock::getInstance();
#endif

#ifdef BMCWEB_ENABLE_GOOGLE_API
    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);
#endif

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

    crow::login_routes::requestRoutes(app);

    setupSocket(app);

#ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
    int rc = redfish::EventServiceManager::startEventLogMonitor(*io);
    if (rc != 0)
    {
        BMCWEB_LOG_ERROR << "Redfish event handler setup failed...";
        return rc;
    }
#endif

    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());

#ifdef BMCWEB_ENABLE_GRPC
    GrpcRedfishService grpc_service(&app, tlbmc_app.get(), io,
                                    io_worker_threads, secure_service_config,
                                    subscriptionService.get());

#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),
        .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),
    };
    GrpcRedfishService insecure_grpc_service(
        &app, tlbmc_app.get(), io, io_worker_threads, insecure_config, nullptr);
#endif

#endif

// 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

    app.validate();
    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;
}
