# frozen_string_literal: true

require 'active_support/concern'

module Deimos
  # Module that producers and consumers can share which sets up configuration.
  module SharedConfig
    extend ActiveSupport::Concern

    # need to use this instead of class_methods to be backwards-compatible
    # with Rails 3
    module ClassMethods
      # @return [Hash]
      def config
        return @config if @config

        # default to none: true
        @config = {
          key_configured: false,
          encode_key: false,
          no_keys: true
        }
        klass = self.superclass
        while klass.respond_to?(:config)
          klass_config = klass.config
          if klass_config
            # default is true for this so don't include it in the merge
            klass_config.delete(:encode_key) if klass_config[:encode_key]
            @config.merge!(klass_config) if klass.config
          end
          klass = klass.superclass
        end
        @config
      end

      # Set the schema.
      # @param schema [String]
      # @return [void]
      def schema(schema)
        config[:schema] = schema
      end

      # Set the namespace.
      # @param namespace [String]
      # @return [void]
      def namespace(namespace)
        config[:namespace] = namespace
      end

      # Set key configuration.
      # @param field [Symbol] the name of a field to use in the value schema as
      #   a generated key schema
      # @param schema [String, Symbol] the name of a schema to use for the key
      # @param plain [Boolean] if true, do not encode keys at all
      # @param none [Boolean] if true, do not use keys at all
      # @return [void]
      def key_config(plain: nil, field: nil, schema: nil, none: nil)
        config[:key_configured] = true
        config[:no_keys] = none
        config[:encode_key] = !plain && !none
        config[:key_field] = field&.to_s
        config[:key_schema] = schema
      end

      # @param use_schema_classes [Boolean]
      # @return [void]
      def schema_class_config(use_schema_classes)
        config[:use_schema_classes] = use_schema_classes
      end
    end
  end
end
