define([
	'items/generators/slots'
], function (
	slots
) {
	return {
		type: 'gatherResource',

		need: null,
		gatherType: null,
		requiredQuality: 0,
		have: 0,

		build: function () {
			if (!this.need) {
				this.need = 2 + ~~(Math.random() * 3);

				this.gatherType = ['herb', 'fish'][~~(Math.random() * 2)];

				if (this.gatherType == 'fish') {
					this.name = 'Lure of the Sea';

					var isQualityQ = (Math.random() < 0.3);
					if (isQualityQ) {
						this.requiredQuality = 1 + ~~(Math.random() * 2);
						this.need = 1;
					}
				}
			}

			if (['herb', 'fish'].indexOf(this.gatherType) == -1)
				this.gatherType = 'herb';

			this.typeName = (this.gatherType == 'herb') ? 'herbs' : 'fish';

			this.updateDescription();

			return true;
		},

		getXpMultiplier: function () {
			if (this.requiredQuality == 2)
				return 8;
			else if (this.requiredQuality == 1)
				return 6;
			else
				return this.need;
		},

		updateDescription: function () {
			var typeName = this.typeName;
			if (this.requiredQuality > 0)
				typeName = ['big', 'giant'][this.requiredQuality - 1] + ' ' + typeName;

			var action = ({
				herb: 'Gather',
				fish: 'Catch'
			})[this.gatherType];

			this.description = `${action} ${this.have}/${this.need} ${typeName}`;
		},

		events: {
			afterGatherResource: function (gatherResult) {
				if (gatherResult.nodeType != this.gatherType)
					return;
				else if ((this.requiredQuality) && (gatherResult.items[0].quality < this.requiredQuality))
					return;

				if ((this.obj.zoneName != this.zoneName) || (this.have >= this.need))
					return;

				this.have++;
				this.updateDescription();

				this.obj.syncer.setArray(true, 'quests', 'updateQuests', this.simplify(true));

				if (this.have >= this.need)
					this.ready();
			}
		}
	};
});
