# typed: strict

# TODO: Move these requires to smaller modules.
#       Would be better to lazy load these; not
#       all of these components will be used in
#       every application.
# require_relative 'core/buffer/cruby'
# require_relative 'core/buffer/random'
# require_relative 'core/buffer/thread_safe'
# require_relative 'core/chunker'
# require_relative 'core/configuration'
# require_relative 'core/diagnostics/environment_logger'
# require_relative 'core/diagnostics/ext'
# require_relative 'core/diagnostics/health'
# require_relative 'core/encoding'
# require_relative 'core/environment/cgroup'
# require_relative 'core/environment/class_count'
# require_relative 'core/environment/container'
# require_relative 'core/environment/ext'
# require_relative 'core/environment/gc'
# require_relative 'core/environment/identity'
# require_relative 'core/environment/socket'
# require_relative 'core/environment/thread_count'
# require_relative 'core/environment/variable_helpers'
# require_relative 'core/environment/vm_cache'
# require_relative 'core/error'
# require_relative 'core/event'
# require_relative 'core/git/ext'
# require_relative 'core/logger'
# require_relative 'core/metrics/client'
# require_relative 'core/metrics/ext'
# require_relative 'core/metrics/helpers'
# require_relative 'core/metrics/logging'
# require_relative 'core/metrics/metric'
# require_relative 'core/metrics/options'
# require_relative 'core/pin'
# require_relative 'core/quantization/hash'
# require_relative 'core/quantization/http'
# require_relative 'core/runtime/ext'
# require_relative 'core/runtime/metrics'
# require_relative 'core/utils'
# require_relative 'core/utils/compression'
# require_relative 'core/utils/database'
# require_relative 'core/utils/forking'
# require_relative 'core/utils/object_set'
# require_relative 'core/utils/only_once'
# require_relative 'core/utils/sequence'
# require_relative 'core/utils/string_table'
# require_relative 'core/utils/time'
# require_relative 'core/worker'
# require_relative 'core/workers/async'
# require_relative 'core/workers/interval_loop'
# require_relative 'core/workers/polling'
# require_relative 'core/workers/queue'
# require_relative 'core/workers/runtime_metrics'

require_relative 'core/extensions'

# We must load core extensions to make certain global APIs
# accessible: both for Datadog features and the core itself.
module Datadog
  # Common, lower level, internal code used (or usable) by two or more
  # products. It is a dependency of each product. Contrast with Datadog::Kit
  # for higher-level features.
  module Core
  end

  extend Core::Extensions

  # Add shutdown hook:
  # Ensures the Datadog components have a chance to gracefully
  # shut down and cleanup before terminating the process.
  at_exit do
    if Interrupt === $! # rubocop:disable Style/SpecialGlobalVars is process terminating due to a ctrl+c or similar?
      Datadog.send(:handle_interrupt_shutdown!)
    else
      Datadog.shutdown!
    end
  end
end