//@exclude
'use strict';
//@endexclude

(function() {


    /**
     * A builder for borrowed management requests.
     *
     * @param {String}  id resource ID.
     *
     * @class
     * @memberOf corbel.Borrow.BorrowBuilder
     */
     corbel.Borrow.BorrowBuilder = corbel.Services.inherit({

        constructor: function(id) {
            this.id = id;
            this.uri = 'resource';
        },
        /**
         * Adds the loanable resource.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {Object}   loanable resource                          The loanable resource data.
         * @param {String}   loanableResource.resourceId                Identifier of resource
         * @param {Object[]} loanableResource.licenses                  Licenses list
         * @param {number}   loanableResource.licenses[].availableUses  Amount of uses that the resource is available
         * @param {number}   loanableResource.licenses[].availableLoans Amount of concurrent loans are available for the resource
         * @param {timestamp}loanableResource.licenses[].expire         Expire date
         * @param {timestamp}loanableResource.licenses[].start          Start date
         * @param {Object}   loanableResource.asset                     Asigned to the resource
         * @param {String[]} loanableResource.asset.scopes              Scope list
         * @param {String}   loanableResource.asset.name                Asset name
         *
         * @return {Promise} A promise with the id of the created loanable resources or fails
         *                   with a {@link corbelError}.
         */
        add: function(loanableResource) {
            console.log('borrowInterface.resource.add', loanableResource);
            return this.request({
                url: this._buildUri(this.uri),
                method: corbel.request.method.POST,
                data: loanableResource,
            }).then(function(res) {
                res.data = corbel.Services.getLocationId(res);
                return res;
            });
        },
        /**
         * Get a loanable resource.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise with loanable resource {Object} or fails with a {@link corbelError}.
         */
        get: function() {
            console.log('borrowInterface.resource.get');
            return this.request({
                url: this._buildUri(this.uri ,this.id),
                method: corbel.request.method.GET
            });
        },
        /**
         * Delete a loanable resource.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        delete: function() {
            console.log('borrowInterface.resource.delete');
            return this.request({
                url: this._buildUri(this.uri, this.id),
                method: corbel.request.method.DELETE
            });
        },
        /**
         * Add license to loanable resource.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {Object} data   licenses data.
         * @param {Object} license                 The license data.
         * @param {String} license.resourceId      Identifier of resource
         * @param {number} licensee.availableUses  Amount of uses that the resource is available
         * @param {number} license.availableLoans  Amount of concurrent loans are available for the resource
         * @param {timestamp} license.expire       Expire date
         * @param {timestamp} licensee.start       Start date
         * @param {String} license.asset           Asigned to the resource

         * @return {Promise} A promise with the id of the created a license or fails
         *                   with a {@link corbelError}.
         */
        addLicense: function(license) {
            console.log('borrowInterface.resource.addLicense', license);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'license'),
                method: corbel.request.method.POST,
                data: license,
            }).then(function(res) {
                res.data = corbel.Services.getLocationId(res);
                return res;
            });
        },
        /**
         * Apply loan.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {String} userId    user id.
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        applyFor: function(userId) {
            console.log('borrowInterface.resource.applyFor', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/' + userId),
                method: corbel.request.method.PUT
            });
        },
        /**
         * Apply loan for user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        applyForMe: function() {
            console.log('borrowInterface.resource.applyForMe');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/me'),
                method: corbel.request.method.PUT
            });
        },
        /**
         * Get lent.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {String} userId    user id.
         *
         * @return {Promise} A promise with user lents {Object} or fails with a {@link corbelError}.
         */
        getLentOf: function(userId) {
            console.log('borrowInterface.resource.getLentOf', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/' + userId),
                method: corbel.request.method.GET
            });
        },
        /**
         * Get lent of user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         * @return {Promise} A promise with user logged lents {Object} or fails with a {@link corbelError}.
         */
        getMyLent: function() {
            console.log('borrowInterface.resource.getMyLent');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/me'),
                method: corbel.request.method.GET
            });
        },
        /**
         * Return lent.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {String} userId    user id.
         *
         * @return {Promise} A promise resolves to undefined (void) or fails with a {@link corbelError}.
         */
        returnLoanOf: function(userId) {
            console.log('borrowInterface.resource.returnLoanOf', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/' + userId),
                method: corbel.request.method.DELETE
            });
        },
        /**
         * Return loan of user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise resolves to undefined (void) or fails with a {@link corbelError}.
        */
        returnMyLoan: function() {
            console.log('borrowInterface.resource.returnMyLoan');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'loan/me'),
                method: corbel.request.method.DELETE
            });
        },
        /**
         * Renew loan.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param  {String} userId    The userId
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        renewFor: function(userId) {
            console.log('borrowInterface.resource.renewFor', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'renewal/' + userId),
                method: corbel.request.method.PUT
            });
        },
        /**
         * Renew loan for user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        renewForMe: function() {
            console.log('borrowInterface.resource.renewForMe');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'renewal/me'),
                method: corbel.request.method.PUT
            });
        },
        /**
         * Reserve a resource.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param  {String} userId    The userId
         *
         * @return {Promise} A promise  resolves to undefined (void) or fails with a {@link corbelError}.
         */
        reserveFor: function(userId) {
            console.log('borrowInterface.resource.reserveFor', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'reservation/' + userId),
                method: corbel.request.method.PUT
            });
        },
        /**
         * Reserve a resource for user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise resolves to undefined (void) or fails with a {@link corbelError}.
         */
        reserveForMe: function() {
            console.log('borrowInterface.resource.reserveForMe');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'reservation/me'),
                method: corbel.request.method.PUT
            });
        },
         /**
         * Cancel reservation.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {String} userId    user id.
         *
         * @return {Promise} A promise resolves to undefined (void) or fails with a {@link corbelError}.
         */
        cancelReservationFor: function(userId) {
            console.log('borrowInterface.resource.cancelReservationFor', userId);
            return this.request({
                url: this._buildUri(this.uri, this.id, 'reservation/' + userId),
                method: corbel.request.method.DELETE
            });
        },
        /**
         * Cancel reservation for user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise resolves to undefined (void) or fails with a {@link corbelError}.
        */
        cancelMyReservation: function() {
            console.log('borrowInterface.resource.cancelMyReservation');
            return this.request({
                url: this._buildUri(this.uri, this.id, 'reservation/me'),
                method: corbel.request.method.DELETE
            });
        },
        /**
         * get the user borrowed history.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @param {String} userId    user id.
         *
         * @return {Promise} A promise with user borowed {Object} history or fails with a {@link corbelError}.
         */
        getHistoryOf: function(userId) {
            console.log('borrowInterface.resource.getHistoryOf', userId);
            return this.request({
                url: this._buildUri(this.uri, 'history/' + userId),
                method: corbel.request.method.GET
            });
        },
        /**
         * Get lent of user logged.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         * @return {Promise} A promise with user logged borrowed {Object} history or fails with a {@link corbelError}.
         */
        getMyHistory: function() {
            console.log('borrowInterface.resource.getMyHistory');
            return this.request({
                url: this._buildUri(this.uri, 'history/me'),
                method: corbel.request.method.GET
            });
        },
        /**
         * get full resources borrowed history.
         *
         * @method
         * @memberOf corbel.Borrow.BorrowBuilder
         *
         * @return {Promise} A promise with borowed full {Object} history or fails with a {@link corbelError}.
         */
        getFullHistory: function(params) {
            console.log('borrowInterface.resource.getFullHistory');
            return this.request({
                url: this._buildUri(this.uri, 'history/'),
                method: corbel.request.method.GET,
                query: params ? corbel.utils.serializeParams(params) : null
            });
        },

        _buildUri: corbel.Borrow._buildUri
    });
})();
