Db = undefined
Mongolian = require 'mongolian'

class MongoDB
	constructor: (model) ->
		@collection = Db.collection model.collectionName
		for key in model::keys
			@collection.ensureIndex key.key if key.index
		
		undefined
	
	find: (options, callback) ->
		fields = {}
		notFields = ['limit', 'skip', 'sort']
		
		for field of options
			fields[field] = options[field] if options.hasOwnProperty(field) and -1 is notFields.indexOf(field)
		
		if fields._id
			fields = _id: new Mongolian.ObjectId(fields._id)
		
		query = @collection.find(fields)
		query = query.sort options.sort if options.sort
		query = query.limit options.limit if options.limit
		query = query.skip options.skip if options.skip
		
		query.toArray (err, items) ->
			return callback(err, []) if err or not items
			
			for item in items
				item._id = item._id.toString() if item._id
			
			callback err, items
	
	create: (fields, callback) ->
		@collection.insert fields, (err, item) ->
			item._id = item._id.toString() if item._id
			callback err, item
	
	update: (fields, callback) ->
		_id = new Mongolian.ObjectId fields._id
		delete fields._id
		
		@collection.update { _id: _id }, fields, (err) -> callback err
	
	remove: (fields, callback) ->
		@collection.remove { _id: new Mongolian.ObjectId(fields._id) }, (err) -> callback err
	
	removeAll: (done) ->
		@collection.drop -> done()
	
	@connect: (hosts, done) ->
		return done() if not hosts[0]
		
		Db = new Mongolian hosts[0], log:
			debug: ->
			info: ->
		
		done()
	
	@disconnect: (done) -> done()
	
	@Extensions: {}

class MongoDB.Extensions.ClassMethods
	collection: (@collectionName) ->
	
module.exports = MongoDB