module Jamnagar
  module Refineries
    class ContentRefinery
      def initialize(options={})
        @items     = options[:items] || []
        @refiners  = options[:refiners] || []
        @verifiers = options[:verifiers] || []
        @storage   = options[:storage] || Storage::ItemStore.new
        @logger    = options[:logger]  || Jamnagar::Utilities::SilentLogger.new
        @runner    = options[:runner]  || Jamnagar::Utilities::Runner.new
      end

      def refine
        @items.each_with_index do |item, index|
          begin
            @runner.run do
              @storage.insert(verify(enrich(convert(item))))
            end
          rescue Jamnagar::Adapters::InsertError
            @logger.error("Insert Error: _id => #{item['_id']}")
          end
        end
      end

    private
      def enrich(item)
        @refiners.each do |refiner|
          item = refiner.refine(item)
        end
        item
      end

      def verify(item)
        @verifiers.each do |verifier|
          item = verifier.verify(item)
        end
        item
      end

      def convert(item)
        return Jamnagar::Materials::Item.new(item) if item.is_a?(Hash)
        item
      end
    end
  end
end