'use strict'

var helpers = require('../helpers'),
    util = require('util'),
    _ = require('lodash')

var UsergridQuery = function(type) {

    var self = this

    var query = '',
        queryString,
        sort,
        __nextIsNot = false

    // builder pattern
    _.assign(self, {
        type: function(value) {
            self._type = value
            return self
        },
        collection: function(value) {
            self._type = value
            return self
        },
        limit: function(value) {
            self._limit = value
            return self
        },
        eq: function(key, value) {
            query = self.andJoin(util.format('%s = %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        gt: function(key, value) {
            query = self.andJoin(util.format('%s > %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        gte: function(key, value) {
            query = self.andJoin(util.format('%s >= %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        lt: function(key, value) {
            query = self.andJoin(util.format('%s < %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        lte: function(key, value) {
            query = self.andJoin(util.format('%s <= %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        contains: function(key, value) {
            query = self.andJoin(util.format('%s contains %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        locationWithin: function(distanceInMeters, lat, lng) {
            query = self.andJoin(util.format('location within %s of %s, %s', distanceInMeters, lat, lng))
            return self
        },
        asc: function(key) {
            self.sort(key, 'asc')
            return self
        },
        desc: function(key) {
            self.sort(key, 'desc')
            return self
        },
        sort: function(key, order) {
            sort = (key && order) ? util.format(' order by %s %s', key, order) : ''
            return self
        },
        fromString: function(string) {
            queryString = string
            return self
        },
        andJoin: function(append) {
            if (__nextIsNot) {
                append = util.format("not %s", append)
                __nextIsNot = false
            }
            if (!append) {
                return query
            } else if (query.length === 0) {
                return append
            } else {
                return (_.endsWith(query, 'and') || _.endsWith(query, 'or')) ? util.format('%s %s', query, append) : util.format('%s and %s', query, append)
            }
        },
        orJoin: function() {
            return (query.length > 0 && !_.endsWith(query, 'or')) ? util.format('%s or', query) : query
        }
    })

    // required properties
    self._type = self._type || type

    // public accessors
    Object.defineProperty(self, '_ql', {
        get: function() {
            return queryString || util.format('select * where %s%s', query || '', sort || '')
        }
    })

    Object.defineProperty(self, 'and', {
        get: function() {
            query = self.andJoin('')
            return self
        }
    })

    Object.defineProperty(self, 'or', {
        get: function() {
            query = self.orJoin()
            return self
        }
    })

    Object.defineProperty(self, 'not', {
        get: function() {
            __nextIsNot = true
            return self
        }
    })

    return self
}

module.exports = UsergridQuery