'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

/**
 * Licensed Materials - Property of IBM
 * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2019, 2020
 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */
define(['underscore'], function (_) {

	return function () {
		function VisMapColumnsToSlot() {
			var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

			_classCallCheck(this, VisMapColumnsToSlot);

			this.content = options.content;
			this.visualization = options.visualization;
			this.slots = this.visualization.getSlots();
			this.transaction = options.transaction;
		}

		VisMapColumnsToSlot.prototype.mapColumns = function mapColumns(slotId, droppedColumns) {
			var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
			var transactionToken = arguments[3];

			var columns = droppedColumns;
			var metadataColumns = _.pluck(droppedColumns, 'metadataColumn');
			var originalMetadataColumns = _.chain(droppedColumns).pluck('original').compact().pluck('metadataColumn').value();
			var slot = this.slots.getSlot(slotId);
			if (slot) {
				var position = options.position,
				    bReplace = options.bReplace,
				    activeDataSourceId = options.activeDataSourceId;

				var canSetLocalFilters = _.isBoolean(options.canSetLocalFilters) ? options.canSetLocalFilters : true;
				var slotDataItemList = slot.getDataItemList();
				var localFilters = this.visualization.getLocalFilters();
				var subTransactionToken = this.transaction.startTransaction(transactionToken);
				// before add data items, ensure the visulization datasource is set. Could fail 
				// in certain conditions, for example if the visualization don't support the datasource.
				this._setDataSource(metadataColumns, subTransactionToken, activeDataSourceId);
				if (this.visualization.getDataSource() === null) {
					this.transaction.endTransaction(subTransactionToken);
					return;
				}

				if (bReplace && slotDataItemList.length) {
					//Delete local filters associated with this data item so that it will get added to undo/redo stack
					var filterKey = { itemId: slotDataItemList[position].getColumnId() };
					if (localFilters.filterExists(filterKey)) {
						localFilters.removeFilter(filterKey, subTransactionToken);
					}
					var ids = [slotDataItemList[position].getId()];
					slot.removeDataItems(ids, subTransactionToken);
					if (this.visualization.getDataSource() === null) {
						this._setDataSource(metadataColumns, subTransactionToken, activeDataSourceId);
					}
				}

				var localFltersSpec = [];
				if (canSetLocalFilters) {
					var result = this._getLocalFilters({
						slot: slot,
						columns: columns,
						bReplace: bReplace
					}, subTransactionToken);

					localFltersSpec.push.apply(localFltersSpec, result);
				}

				metadataColumns = _.pluck(columns, 'metadataColumn');
				var columnSpecs = _.map(metadataColumns, function (metadataColumn) {
					return { columnId: metadataColumn.getId() };
				});
				if (columnSpecs.length) {
					var _dataItemList = slot.addDataItems(columnSpecs, position, subTransactionToken);
					var items = originalMetadataColumns;
					items && items.forEach(function (item, index) {
						var navPathId = item.getParent() ? item.getParent().getId() : null;

						if (navPathId && item.getParent().getObjectType().toLowerCase() === 'drillgroup') {
							_dataItemList[index].setNavigationPathId(navPathId, subTransactionToken);
						}
					});
				}

				var dataItemList = slot.getDataItemList();
				localFltersSpec.forEach(function (spec) {
					//if dataItem is added to slot or visualization, then add filters,
					// if dataItem is not added due to any reason, do not add filters
					var dataItem = dataItemList.find(function (dataItem) {
						return dataItem.getColumnId() === spec.itemContext.itemId;
					}) || null;
					if (dataItem) {
						if (spec.hasFilters) {
							localFilters.editFilter(spec.itemContext, spec.filterContext, subTransactionToken);
						} else {
							localFilters.addFilter(spec.itemContext, spec.filterContext, subTransactionToken);
						}
					}
				});

				this.transaction.endTransaction(subTransactionToken);
			}
		};

		VisMapColumnsToSlot.prototype._setDataSource = function _setDataSource(metadataColumns, transactionToken, activeDataSourceId) {
			var sourceId = activeDataSourceId;
			if (!sourceId && metadataColumns.length > 0) {
				var firstMetadataColumn = metadataColumns[0];
				sourceId = firstMetadataColumn.getSourceId();
			}
			this.visualization.setDataSource(sourceId, transactionToken);
		};

		VisMapColumnsToSlot.prototype._getLocalFilters = function _getLocalFilters() {
			var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
			var transactionToken = arguments[1];

			return this.content.getFeature('VisDnD.utils').addMembersAsLocalFilters({
				slotAPI: context.slot,
				doUpdateFilters: false,
				columns: context.columns,
				bReplace: context.bReplace
			}, transactionToken);
		};

		return VisMapColumnsToSlot;
	}();
});
//# sourceMappingURL=VisMapColumnsToSlot.js.map