# -*- encoding: utf-8 -*-
# frozen_string_literal: true
module K
  module Replace
    class Statement
      include Keys
      include Changes

      attr_reader :source, :keys

      def initialize(source)
        @keys = []
        @source = source

        find_all(@source) do |key|
          @keys << key
        end
      end

      def replace(*objects)
        objs = hash_objects(objects)
        @source.gsub(kreplace.key_pattern) do |key|
          replaced = ''
          find_all(key) do |match|
            chained = chain_property(match)
            chained.each{|k, v| replaced = resolve_property(k, v, objs[k])}
          end
          replaced
        end
      end

      private

      def resolve_property(ch_key, ch_value, obj)
        return resolve_property ch_value.keys[0], ch_value[ch_value.keys[0]], obj.send(ch_value.keys[0].to_s) if ch_value.is_a?(Hash)
        obj.send(ch_value)
      end
    end
  end
end