Pg = require('pg')
Db = undefined

class PGDriver
	constructor: (model) ->
		@table = model.collectionName
		for key in model::keys
			@primaryKey = key.key if key.primary
		
		undefined
	
	find: (options, callback) ->
		fields = {}
		keys = []
		notFields = ['limit', 'skip', 'sort']
		
		for field of options
			if options.hasOwnProperty(field) and -1 is notFields.indexOf(field)
				fields[field] = options[field]
				keys.push field
		
		keys[0] ||= '*'
		
		Db.query "SELECT #{ keys.join ',' } FROM #{ @table }", (err, result) ->
			callback err, result.rows
	
	create: (fields, callback) ->
		values = []
		
		for key of fields
			if fields.hasOwnProperty(key)
				values.push "\'#{ fields[key] }\'"
		
		Db.query "INSERT INTO #{ @table } (#{ Object.keys(fields).join ',' }) VALUES (#{ values.join ',' }) RETURNING #{ @primaryKey }", (err, result) =>
			fields[@primaryKey] = result.rows[0][@primaryKey] if not err
			callback err, fields
	
	update: (fields, callback) ->
		values = []
		set = []
		
		for key of fields
			if fields.hasOwnProperty(key)
				set.push "#{ key } = \'#{ fields[key] }\'"
				values.push "\'#{ fields[key] }\'"
		
		Db.query "UPDATE #{ @table } SET #{ set.join ', ' } WHERE #{ @primaryKey } = #{ fields[@primaryKey] }", (err) ->
			callback err
	
	remove: (fields, callback) ->
		Db.query "DELETE FROM #{ @table } WHERE #{ @primaryKey } = \'#{ fields[@primaryKey] }\'", (err) ->
			callback err
		
	removeAll: (done) ->
		Db.query "TRUNCATE TABLE #{ @table }", -> done()
	
	@connect: (hosts, done) ->
		return done() if not hosts[0]
		
		Pg.connect hosts[0], (err, client) ->
			Db = client if not err
			done()
	
	@disconnect: (done) ->
		Db.end()
		
	@Extensions: {}

class PGDriver.Extensions.ClassMethods

module.exports = PGDriver