# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
# frozen_string_literal: true

cs__scoped_require 'English'

# This must precede other Contrast C extensions
cs__scoped_require 'cs__common/cs__common'
# This must precede any patching we do as we log patches and we shouldn't cause
# requires to happen during that process.
cs__scoped_require 'contrast/components/logger'

# defining instrumentation, this must precede core extensions
# because they need to register their patches
cs__scoped_require 'contrast/agent/patching/policy/patcher'
cs__scoped_require 'contrast/agent/patching/policy/patch'

# core extensions
cs__scoped_require 'contrast/extension/assess'
cs__scoped_require 'contrast/extension/delegator'
cs__scoped_require 'contrast/extension/inventory'
cs__scoped_require 'contrast/extension/module'
cs__scoped_require 'contrast/extension/protect'
cs__scoped_require 'contrast/extension/protect/kernel'

cs__scoped_require 'contrast/utils/object_share'
cs__scoped_require 'contrast/utils/boolean_util'
cs__scoped_require 'contrast/utils/string_utils'
cs__scoped_require 'contrast/utils/io_util'
cs__scoped_require 'contrast/utils/os'

cs__scoped_require 'contrast/common_agent_configuration'

cs__scoped_require 'contrast/utils/hash_digest'
cs__scoped_require 'contrast/utils/invalid_configuration_util'

# scoping
cs__scoped_require 'contrast/agent/scope'

cs__scoped_require 'contrast/utils/thread_tracker'

# Framework support
cs__scoped_require 'contrast/framework/manager'

module Contrast
  # Top namespace of the Agent section. Holds tracking contexts that will be
  # accessed throughout the Agent.
  module Agent
    # build a map for tracking the context of the current request
    REQUEST_TRACKER = Contrast::Utils::ThreadTracker.new

    def self.framework_manager
      @_framework_manager ||= Contrast::Framework::Manager.new
    end
  end
end

cs__scoped_require 'contrast/api'

cs__scoped_require 'contrast/utils/resource_loader'
cs__scoped_require 'contrast/utils/duck_utils'
cs__scoped_require 'contrast/agent/tracepoint_hook'
cs__scoped_require 'contrast/agent/at_exit_hook'

# communication with contrast service
cs__scoped_require 'contrast/agent/exclusion_matcher'
cs__scoped_require 'contrast/agent/socket_client'

# threads that handle contrast scope
cs__scoped_require 'contrast/agent/thread'

# keep track of attacks
cs__scoped_require 'contrast/agent/request_context'

cs__scoped_require 'contrast/agent/assess'

# protect rules
cs__scoped_require 'contrast/agent/protect/rule'

# application libraries and technologies
cs__scoped_require 'contrast/utils/gemfile_reader'

# rack event monitoring
cs__scoped_require 'contrast/agent/middleware'

# TODO: RUBY-919
# Refactor to use Contrast::Framework::Manager
# Contrast::Framework::Manager.before_load_patches!
if defined?(::Rails)
  cs__scoped_require 'contrast/framework/rails/patch/support'
  cs__scoped_require 'contrast/framework/rails/patch/rails_application_configuration'
  Contrast::Framework::Rails::Patch::RailsApplicationConfiguration.instrument
  cs__scoped_require 'contrast/agent/railtie' if ::Rails::VERSION::MAJOR.to_i >= 3
end