log = console.log 

# import sync functions
proxySync = require('./sync').proxySync
sync = require('./sync').sync


## MongoDB ##
class MongoDb
	# opts: {name, address, port, collections}
	constructor: (opts)->
		# import mongo classes
		MongoDb = require('mongodb').Db
		MongoServer = require('mongodb').Server
		# create db instance
		@db = new MongoDb(opts.db, new MongoServer(opts.address, opts.port, {}))
		# create collection wrappers
		for collection in opts.collections
			@[collection] = new Collection(@db, collection)
		# proxy sync methods to db instance
		proxySync(@db, @, ['open', 'close', 'collection'])

	use: (actions)->
		@open()
		actions()
		@close()

class SyncCursor
	constructor: (@cursor)->
		proxySync(@cursor, @, ['toArray'])

class Collection
	constructor: (@db, @name)->	
		@collection = @db.collection(@name)
		methods = ['count', 'insert', 'find', 'findOne', 'remove', 'findAndModify', 'findAndREmove', 'save']
		proxySync(@collection, @, methods)
		@_find = @find
		@find = @findSyncCursor

	findSyncCursor: (args...)->
		new SyncCursor(@_find(args...))

# tests #
# sync ()->
# 	ObjectID = require('mongodb').ObjectID
# 	db = new Db('test', '127.0.0.1', 27017, ['friends'])
# 	db.use ()->	
# 		log db.friends.insert(name: 'John Doe')
# 		log "Count: #{db.friends.count()}"
# 		john = db.friends.findOne({_id: ObjectID('4f0787dae953852732000001')})
# 		john.age = 22
# 		db.friends.save(john)
# 		john2 = db.friends.findOne({_id: ObjectID('4f0787dae953852732000001')})
# 		console.log john2


## Redis ##

class Redis	
	constructor: ()->
		redis = require('redis')
		@client = redis.createClient()
		# set up sync proxy methods
		keys = 'del exists expire expireat keys move object persist randomkey rename renamenx sort ttl type eval'.split(' ')
		strings = 'append decr decrby get getbit getrange getset incr incrby mget mset msetnx set setbit setex setnx setrange strlen'.split(' ')
		proxySync(@client, @, keys.concat(strings))

# tests #
# sync ()->
# 	redis = new Redis()
# 	log redis.set('Happy Key', 20)
# 	log redis.incr('Happy Key')
# 	log redis.get('Happy Key')


## Scheduled Tasks ##
class TaskScheduler

## Queues - ZRPC - ZeroMQ and Guaranteed RPC tooling like WebRPC? + Resume, Balancing, and  Discovery ##

## Elastic Search ##

# class ElasticSearch

## DynamoDB ##

## S3 ##

## CloudFiles ##


exports.MongoDb = MongoDb
exports.Redis = Redis
