# frozen_string_literal: true

require "securerandom"
require "digest"
Rails.env = ENV["RAILS_ENV"] || "test"

module Combustion
  class Application < Rails::Application
    CONFIGURERS = [
      Combustion::Configurations::ActiveRecord,
      Combustion::Configurations::ActionController,
      Combustion::Configurations::ActionMailer,
      Combustion::Configurations::ActiveStorage
    ].freeze

    rails_gate = VersionGate.new("railties")

    if rails_gate.call(">= 7.2.0.alpha")
      config.load_defaults Rails::VERSION::STRING.to_f
    end

    # Core Settings
    config.cache_classes               = true
    config.consider_all_requests_local = true
    config.eager_load                  = Rails.env.production?

    config.secret_key_base = SecureRandom.hex if rails_gate.call(">= 4.0")
    config.whiny_nils      = true             if rails_gate.call("< 4")
    if rails_gate.call("< 5.2")
      config.secret_token = Digest::SHA1.hexdigest Time.now.to_s
    end
    if rails_gate.call("~> 7.1.0.alpha")
      config.active_support.cache_format_version = 7.1
    end

    # ActiveSupport Settings
    config.active_support.deprecation = :stderr

    # Some settings we're not sure if we want, so let's not load them by
    # default. Instead, wait for this method to be invoked (to get around
    # load-order complications).
    def self.configure_for_combustion
      config.root = File.expand_path File.join(Dir.pwd, Combustion.path)

      CONFIGURERS.each { |configurer| configurer.call config }

      config.assets.enabled = true if defined?(Sprockets)
    end

    initializer(
      :load_customized_environment_for_combustion,
      :before => :load_environment_config,
      :group  => :all
    ) do
      next unless Combustion.setup_environment

      Combustion::Application.class_eval(&Combustion.setup_environment)
    end
  end
end
