'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 Watson Analytics (C) Copyright IBM Corp. 2018, 2019
 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */
define(['underscore', '../../utils/DatasourceUtil', './SynchContextHelper', './SynchronizeDataHelper'], function (_, DatasourceUtil, SynchContextHelper, SynchronizeDataHelper) {

	/**
 * Class handling joined table column data within same data source
 */
	var SynchJoinColumn = function () {
		function SynchJoinColumn(column, module, handlers) {
			_classCallCheck(this, SynchJoinColumn);

			this.module = module;
			this.column = column;
			this.handlers = handlers;
			this.joinedTableValues = {};
		}

		SynchJoinColumn.prototype.getItemId = function getItemId() {
			return this.column.getId();
		};

		SynchJoinColumn.prototype.getLabel = function getLabel() {
			return this.column.getLabel();
		};

		SynchJoinColumn.prototype.getTableRef = function getTableRef() {
			this.column.getTableName();
		};

		SynchJoinColumn.prototype.matchedColumnByName = function matchedColumnByName(itemIdToMatch) {
			var columnToVerify = this.module.getMetadataColumn(itemIdToMatch);
			return columnToVerify ? this.column.getLabel().toLowerCase() === columnToVerify.getLabel().toLowerCase() : false;
		};

		SynchJoinColumn.prototype.getJointTupleValue = function getJointTupleValue(itemIdToMatch, valueToMatch) {
			var matchedItemId = this.joinedTableValues[itemIdToMatch];
			if (matchedItemId) {
				return matchedItemId[valueToMatch.u];
			}
		};

		SynchJoinColumn.prototype.matchJointedTableValue = function matchJointedTableValue(column, valueToMatch) {
			var sourceColumn = this.module.getMetadataColumn(column.getItemId());
			//Column does not exist in this module so return null
			if (!sourceColumn) {
				return Promise.resolve(null);
			}

			var sourceTableRef = sourceColumn.getTableName();
			var currentTableRef = this.column.getTableName();

			//Does not point to the same table and these tables are joined
			if (currentTableRef !== sourceTableRef && DatasourceUtil.haveTableJoinsInSameDataSource(this.module, [currentTableRef], [sourceTableRef])) {
				var result = void 0;
				var sourceColumnIsOlap = sourceColumn.isOlapColumn();
				var numeric = !this.column.isOlapColumn() && this.column.isNumericDataType();
				var joinedTableEntry = this.getJointedTableEntry(sourceColumn.getId());
				var dateTime = !this.column.isOlapColumn() && this.column.isDateTimeDataType();

				if (!sourceColumnIsOlap && (numeric || dateTime)) {
					if (numeric) {
						result = joinedTableEntry[valueToMatch.u] = valueToMatch;
					} else {
						var clonedValue = SynchronizeDataHelper.clone(valueToMatch);
						if (SynchContextHelper.replaceUseValue(this.column, clonedValue)) {
							result = joinedTableEntry[valueToMatch.u] = clonedValue;
						}
					}
					return Promise.resolve(result);
				} else {
					return this.handlers.loadValues(this.module, this.column.getId()).then(function (values) {
						values = values || [];
						result = _.find(values, function (value) {
							return valueToMatch.d === value.d;
						});

						if (result) {
							joinedTableEntry[valueToMatch.u] = result;
						}
						return result;
					});
				}
			}
			return Promise.resolve(null);
		};

		SynchJoinColumn.prototype.getJointedTableEntry = function getJointedTableEntry(itemId) {
			this.joinedTableValues[itemId] = this.joinedTableValues[itemId] || {};
			return this.joinedTableValues[itemId];
		};

		return SynchJoinColumn;
	}();

	/**
 * Class responsible for synchronize joined table data within same data source
 */


	var SynchJoinTable = function () {
		function SynchJoinTable(module) {
			var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

			_classCallCheck(this, SynchJoinTable);

			if (!module) {
				throw new Error('module object is not provided.');
			}
			if (!options.handlers) {
				throw new Error('handlers object is not provided.');
			}

			this.module = module;
			this.handlers = options.handlers;
			this.columns = {};
		}

		SynchJoinTable.prototype.getColumn = function getColumn(itemId) {
			if (this.columns[itemId]) {
				return this.columns[itemId];
			}

			var metadataColumn = this.module.getMetadataColumn(itemId);
			if (metadataColumn) {
				this.columns[itemId] = new SynchJoinColumn(metadataColumn, this.module, this.handlers);
			}

			return this.columns[itemId];
		};

		SynchJoinTable.prototype.getColumns = function getColumns() {
			return this.columns;
		};

		return SynchJoinTable;
	}();

	return SynchJoinTable;
});
//# sourceMappingURL=SynchJoinTable.js.map