/*
 * Copyright (c) 2015
 *
 * This file is licensed under the Affero General Public License version 3
 * or later.
 *
 * See the COPYING-README file.
 *
 */

(function(OC) {

	function filterFunction(model, term) {
		return model.get('name').substr(0, term.length).toLowerCase() === term.toLowerCase();
	}

	/**
	 * @class OCA.SystemTags.SystemTagsCollection
	 * @classdesc
	 *
	 * Collection of tags assigned to a file
	 *
	 */
	var SystemTagsCollection = OC.Backbone.Collection.extend(
		/** @lends OC.SystemTags.SystemTagsCollection.prototype */ {

		sync: OC.Backbone.davSync,

		model: OC.SystemTags.SystemTagModel,

		url: function() {
			return OC.linkToRemote('dav') + '/systemtags/';
		},

		filterByName: function(name) {
			return this.filter(function(model) {
				return filterFunction(model, name);
			});
		},

		reset: function() {
			this.fetched = false;
			return OC.Backbone.Collection.prototype.reset.apply(this, arguments);
		},

		/**
		 * Lazy fetch.
		 * Only fetches once, subsequent calls will directly call the success handler.
		 *
		 * @param options
		 * @param [options.force] true to force fetch even if cached entries exist
		 *
		 * @see Backbone.Collection#fetch
		 */
		fetch: function(options) {
			var self = this;
			options = options || {};
			if (this.fetched || options.force) {
				// directly call handler
				if (options.success) {
					options.success(this, null, options);
				}
				// trigger sync event
				this.trigger('sync', this, null, options);
				return Promise.resolve();
			}

			var success = options.success;
			options = _.extend({}, options);
			options.success = function() {
				self.fetched = true;
				if (success) {
					return success.apply(this, arguments);
				}
			};

			return OC.Backbone.Collection.prototype.fetch.call(this, options);
		}
	});

	OC.SystemTags = OC.SystemTags || {};
	OC.SystemTags.SystemTagsCollection = SystemTagsCollection;

	/**
	 * @type OC.SystemTags.SystemTagsCollection
	 */
	OC.SystemTags.collection = new OC.SystemTags.SystemTagsCollection();
})(OC);

