require 'moped'

module Jamnagar
  module Adapters
    class MongoAdapter < Adapter

      def self.driver
        @@driver ||= Moped::Session.new(["127.0.0.1:27017"])
      end

      def initialize(driver=nil, database="test", collection="catchall")
        @driver = driver || Jamnagar::Adapters::MongoAdapter.driver
        @driver.use database
        @collection = collection
      end

      def store(key, value)
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].insert(value)
        end
      end

      def get(key)
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].find("_id" => key).first
        end
      end

      def find(params={})
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].find(params)
        end
      end

      def find_first(params={})
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].find(params).limit(1).first
        end
      end

      def update(query={}, updates={})
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].find(query).update(updates)
        end
      end

      def find_and_modify(params={})
        @driver.with(safe: { wtimeout: 5 }) do |_session|
          _session[@collection.to_sym].find(params[:query]).update(params[:update])
        end
      end
    end
  end
end