# frozen_string_literal: true

module Authlogic
  # Mixed into `Authlogic::ActsAsAuthentic::Base` and
  # `Authlogic::Session::Base`.
  module Config
    E_USE_NORMAL_RAILS_VALIDATION = <<~EOS
      This Authlogic configuration option (%s) is deprecated. Use normal
      ActiveRecord validation instead. Detailed instructions:
      https://github.com/binarylogic/authlogic/blob/master/doc/use_normal_rails_validation.md
    EOS

    def self.extended(klass)
      klass.class_eval do
        # TODO: Is this a confusing name, given this module is mixed into
        # both `Authlogic::ActsAsAuthentic::Base` and
        # `Authlogic::Session::Base`? Perhaps a more generic name, like
        # `authlogic_config` would be better?
        class_attribute :acts_as_authentic_config
        self.acts_as_authentic_config ||= {}
      end
    end

    private

    def deprecate_authlogic_config(method_name)
      ::ActiveSupport::Deprecation.new.warn(
        format(E_USE_NORMAL_RAILS_VALIDATION, method_name)
      )
    end

    # This is a one-liner method to write a config setting, read the config
    # setting, and also set a default value for the setting.
    def rw_config(key, value, default_value = nil)
      if value.nil?
        acts_as_authentic_config.include?(key) ? acts_as_authentic_config[key] : default_value
      else
        self.acts_as_authentic_config = acts_as_authentic_config.merge(key => value)
        value
      end
    end
  end
end
