'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
        },
        cursor: function(value) {
            self._cursor = value
            return self
        },
        eq: function(key, value) {
            query = self.andJoin(util.format('%s = %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        equal: this.eq,
        gt: function(key, value) {
            query = self.andJoin(util.format('%s > %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        greaterThan: this.gt,
        gte: function(key, value) {
            query = self.andJoin(util.format('%s >= %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        greaterThanOrEqual: this.gte,
        lt: function(key, value) {
            query = self.andJoin(util.format('%s < %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        lessThan: this.lt,
        lte: function(key, value) {
            query = self.andJoin(util.format('%s <= %s', key, helpers.query.useQuotesIfRequired(value)))
            return self
        },
        lessThanOrEqual: this.lte,
        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() {
            if (queryString !== undefined) {
                return queryString
            } else {
                return (query.length > 0 || sort !== undefined) ? 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