class ElasticAPM::Config

@api private
rubocop:disable Metrics/ClassLength

def app=(app)

def app=(app)
  case app_type?(app)
  when :sinatra
    set_sinatra(app)
  when :rails
    set_rails(app)
  else
    # TODO: define custom?
    self.service_name = 'ruby'
  end
end

def app_type?(app)

def app_type?(app)
  if defined?(::Rails) && app.is_a?(Rails::Application)
    return :rails
  end
  if app.is_a?(Class) && app.superclass.to_s == 'Sinatra::Base'
    return :sinatra
  end
  nil
end

def build_logger(path, level)

def build_logger(path, level)
  logger = Logger.new(path == '-' ? STDOUT : path)
  logger.level = level
  logger
end

def format_name(str)

def format_name(str)
  str.gsub('::', '_')
end

def initialize(options = nil)

def initialize(options = nil)
  options = {} if options.nil?
  set_defaults
  set_from_env
  set_from_args(options)
  yield self if block_given?
end

def logger=(logger)

def logger=(logger)
  @logger = logger || build_logger(log_path, log_level)
end

def set_defaults

def set_defaults
  DEFAULTS.each do |key, value|
    send("#{key}=", value)
  end
end

def set_from_args(options)

def set_from_args(options)
  options.each do |key, value|
    send("#{key}=", value)
  end
end

def set_from_env

rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
def set_from_env
  ENV_TO_KEY.each do |env_key, key|
    next unless (value = ENV[env_key])
    type, key = key if key.is_a? Array
    value =
      case type
      when :int then value.to_i
      when :float then value.to_f
      when :bool then !%w[0 false].include?(value.strip.downcase)
      when :list then value.split(/[ ,]/)
      else value
      end
    send("#{key}=", value)
  end
end

def set_rails(app)

def set_rails(app)
  self.service_name = format_name(service_name || app.class.parent_name)
  self.framework_name = 'Ruby on Rails'
  self.framework_version = Rails::VERSION::STRING
  self.logger = Rails.logger
  self.root_path = Rails.root.to_s
  self.view_paths = app.config.paths['app/views'].existent
end

def set_sinatra(app)

def set_sinatra(app)
  self.service_name = format_name(service_name || app.to_s)
  self.framework_name = framework_name || 'Sinatra'
  self.framework_version = framework_version || Sinatra::VERSION
  self.enabled_injectors += %w[sinatra]
  self.root_path = Dir.pwd
end

def use_ssl?

def use_ssl?
  server_url.start_with?('https')
end