class ActiveGenie::Configuration

def comparator

def comparator
  @comparator ||= Config::ComparatorConfig.new
end

def extractor

def extractor
  @extractor ||= Config::ExtractorConfig.new
end

def lister

def lister
  @lister ||= Config::ListerConfig.new
end

def llm

def llm
  @llm ||= Config::LlmConfig.new
end

def log

def log
  @log ||= Config::LogConfig.new
end

def logger

def logger
  @logger ||= ActiveGenie::Logger.new(log_config: log)
end

def merge(config_params = {})

def merge(config_params = {})
  return config_params if config_params.is_a?(Configuration)
  new_configuration = dup
  SUB_CONFIGS.each do |key|
    config = new_configuration.send(key)
    next unless config.respond_to?(:merge)
    new_config = sub_config_merge(config, key, config_params)
    new_configuration.send("#{key}=", new_config)
  end
  @logger = nil
  new_configuration
end

def providers

def providers
  @providers ||= Config::ProvidersConfig.new
end

def ranker

def ranker
  @ranker ||= Config::RankerConfig.new
end

def scorer

def scorer
  @scorer ||= Config::ScorerConfig.new
end

def sub_config_merge(config, key, config_params)

def sub_config_merge(config, key, config_params)
  if config_params&.key?(key.to_s)
    config.merge(config_params[key.to_s])
  elsif config_params&.key?(key.to_sym)
    config.merge(config_params[key.to_sym])
  else
    config.merge(config_params || {})
  end
end