'use strict'

var ok = require('objectkit'),
    UsergridQuery = require('./query'),
    UsergridResponseError = require('./responseError'),
    helpers = require('../helpers'),
    _ = require('lodash')

var UsergridResponse = function(response) {
    var self = this
    self.ok = false
    if (!response) {
        return
    } else if (response.statusCode < 400) {
        self.ok = true
        var UsergridEntity = require('./entity.js'),
            UsergridUser = require('./user.js')
        
        _.assign(self, response)

        if (ok(response.body).has('entities')) {
            var entities = response.body.entities.map(function(en) {
                var entity = new UsergridEntity(en)
                if (entity.isUser) {
                    entity = new UsergridUser(entity)
                }
                return entity
            })

            _.assign(self, {
                metadata: _.cloneDeep(response.body),
                entities: entities
            })
            delete self.metadata.entities
            self.first = _.first(entities) || undefined
            self.entity = self.first
            self.last = _.last(entities) || undefined   
            if (ok(self).getIfExists('metadata.path') === '/users') {
                self.user = self.first
                self.users = self.entities
            }

            Object.defineProperty(self, 'hasNextPage', {
                get: function() {
                    return ok(self).has('metadata.cursor')
                }
            })

            helpers.setReadOnly(self.metadata)
        }
    } else {
        _.assign(self, response, {
            error: new UsergridResponseError(response.body)
        })
    }
    return self;
}

UsergridResponse.prototype = {
    loadNextPage: function() {
        var args = helpers.args(arguments)
        var callback = helpers.cb(args)
        if (!this.metadata.cursor) {
            callback()
        }
        var client = helpers.client.validate(args)
        var type = _.last(ok(this).getIfExists('metadata.path').split('/'))
        var limit = _.first(ok(this).getIfExists('metadata.params.limit'))
        var query = new UsergridQuery(type).cursor(this.metadata.cursor).limit(limit)
        return client.GET(query, callback)
    }
}

module.exports = UsergridResponse