# encoding: UTF-8
# frozen_string_literal: true

require 'regexp-match-polyfill' if RUBY_VERSION < '2.4'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/hash/indifferent_access'

class Hash
  unless method_defined?(:camelize)
    def camelize(first_letter = :upper)
      dup.camelize!(first_letter)
    end
  end

  unless method_defined?(:camelize!)
    def camelize!(first_letter = :upper)
      keys.each do |key|
        # Check if key is symbol or string and if it is not CONSTANT_VARIABLE.
        if (Symbol === key || String === key) && !key.match?(/\A[A-Z_][A-Z_0-9]*\z/)
          new_key = (Symbol === key ? key.to_s : key).camelize(first_letter)
          self[Symbol === key ? new_key.to_sym : new_key] = self.delete(key)
        end
      end
      self
    end
  end

  unless method_defined?(:deep_with_indifferent_access)
    def deep_with_indifferent_access
      each_with_object({}) do |(k, v), m|
        m[k] = v.respond_to?(:deep_with_indifferent_access) ? v.deep_with_indifferent_access : v
      end.with_indifferent_access
    end
  end
end

class Array
  unless method_defined?(:deep_with_indifferent_access)
    def deep_with_indifferent_access
      map { |item| item.respond_to?(:deep_with_indifferent_access) ? item.deep_with_indifferent_access : item }
    end
  end

  unless method_defined?(:deep_symbolize_keys)
    def deep_symbolize_keys
      map { |item| item.respond_to?(:deep_symbolize_keys) ? item.deep_symbolize_keys : item }
    end
  end

  unless method_defined?(:deep_stringify_keys)
    def deep_stringify_keys
      map { |item| item.respond_to?(:deep_stringify_keys) ? item.deep_stringify_keys : item }
    end
  end
end