# Constants

module Eitil
  
  Root   = Gem.loaded_specs['eitil']&.full_gem_path
  Layers = %w( eitil_core eitil_support eitil_store eitil_integrate )
  ApplicationRecordModules = []

end



# Configuration

module Eitil 
  class Railtie < ::Rails::Railtie   
    
    # The following configuration has its own special place in the boot sequence:
    # on the one hand, it should run before the initialization of Eitil (gem), but
    # read config assigned by the main app – which is only loaded AFTER all gems have
    # been initialized.

    # Therefore, we only require the specified file from the main app, after defining
    # the possible configurations for the Eitil railtie. This way we escape the boot
    # sequence's dedault order.

    config.before_initialize do |eitil|

      Eitil.mattr_accessor :controller_ivars, 
                           :skip_default_scopes_for_models,
                           :skip_default_calculators_for_models,
                           :skip_default_sorts_for_models,
                           :skip_callback_helper_methods_for_models

      Eitil.controller_ivars                        ||= []
      Eitil.skip_default_scopes_for_models          ||= []
      Eitil.skip_default_calculators_for_models     ||= []
      Eitil.skip_default_sorts_for_models           ||= []
      Eitil.skip_callback_helper_methods_for_models ||= []

      def Eitil.set_config(&block)
        yield Eitil
      end

      config_path = Rails.root + 'config/initializers/internal_engines/eitil.rb'
    
      if File.exists? config_path
        load config_path
      else
        puts "Eitil config not found at #{config_path}, resorting to defaults..."
      end

    end
  end
end



# Loading

module Eitil
  
  class Railtie < ::Rails::Railtie   
    
    Eitil::Layers.each do |layer|

      # Add lib dirs to $LOAD_PATH, making them available in your main app.
      $LOAD_PATH << "#{Eitil::Root}/#{layer}/lib"

      # Load railtie into main app, enabling on the fly inclusion of dispatches.
      require "#{layer}/railtie"
      
    end

  end

end