module Jamnagar
  module Storage
    class ContributorStore < BasicStore
      def initialize(adapter=nil)
        @adapter = adapter || {}
      end

      def find_contributor(item, contributor)
        existing = find_and_update_contributor(item, contributor)
        existing = create_contributor(item, contributor) unless existing
        existing
      end

    private
      def find_and_update_contributor(item, contributor)
        existing = @adapter.find_first({"_id" => contributor["id"]})
        update_contributions(existing, item) if existing
        existing
      end

      def create_contributor(item, contributor)
        contributions = [item["_id"]]
        created = @adapter.store(contributor["id"], contributor.merge({"_id" => contributor["id"], "contributions" => contributions, "contributions_count" => 1}))
        @adapter.find_first({"_id" => created})
      end

      def update_contributions(contributor, item)
        return unless contributor && contributor["contributions"] && item && item["_id"]
        existing_contributions = contributor["contributions"] || []
        contributions =  existing_contributions << item["_id"]
        @adapter.update({"_id" => contributor["_id"]}, "$set" => {"contributions" => contributions}, "$inc" => {"contributions_count" => 1})
      end
    end
  end
end