'use strict';

/**
 * Licensed Materials - Property of IBM
 * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2016, 2017
 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */
define(['../../lib/@waca/core-client/js/core-client/ui/AccessibleView', 'underscore', 'app/nls/StringResources', 'text!./templates/BasePromptView.html', 'text!./templates/DateTimePromptContent.html', '../../lib/@waca/core-client/js/core-client/ui/widgets/DatePicker', '../../lib/@waca/core-client/js/core-client/ui/widgets/TimePicker', 'moment-timezone', 'doT'], function (View, _, stringResources, BasePromptViewTemplate, DateTimePromptContentTemplate, DatePicker, TimePicker, moment, dot) {
	'use strict';

	var DateTimePromptView = View.extend({

		DATE_TIME_FORMAT: 'YYYY-MM-DDTHH:mm:ss',

		_iHeight: '212',

		startDate: null,
		endDate: null,
		startTime: null,
		endTime: null,
		timezone: null,

		/**
   * @classdesc  Date, Time, DateTime prompt view class.
   * @public
   *
   * @param {String} options.columnId - The prompt item column ID.
   * @param {String} options.name - The parameter name.
   * @param {String} options.dataType -The parameter data type.
   * @param {Object} options.capabilities -The capabilities of the prompt.
   * @param {String} options.timezone -The timezone in user preferences.
   */
		init: function init(options) {

			DateTimePromptView.inherited('init', this, arguments);

			_.extend(this, options);
			this._isRangePrompt = options.capabilities.multivalued && !options.capabilities.discreteValue;

			if (options.timezone) {
				this.timezone = options.timezone;
			} else {
				this.timezone = 'America/New_York';
			}
		},

		render: function render() {

			var sBasePromptViewHtml = dot.template(BasePromptViewTemplate)({
				promptModuleName: this.promptModuleName
			});

			this.$el.addClass('popoverDialogContainer promptViewDialog').height(this._iHeight + 'px').width(this._iWidth + 'px').append(sBasePromptViewHtml);

			this.$el.attr('role', 'region');
			this.$el.attr('aria-label', this.viewTitle);

			var dateTitle = stringResources.get('dateTitle');
			var timeTitle = stringResources.get('timeTitle');

			var sPromptContentHtml = dot.template(DateTimePromptContentTemplate)({
				dataType: this.dataType,
				//title: stringResources.get('dateTimeFilterMessage'), //stringResourecs.get('promptControlTitle');
				isRangePrompt: this._isRangePrompt
			});
			this.$('.content').append(sPromptContentHtml);

			return new Promise(function (resolve) {
				switch (this.dataType) {
					case 'xsdDate':
						this._renderDate().then(function () {
							this.$el.find('.dateTitle').text(dateTitle);
							resolve(this);
						}.bind(this));

						break;

					case 'xsdDateTime':
						this._renderDateTime().then(function () {
							this.$el.find('.dateTitle').text(dateTitle);
							this.$el.find('.timeTitle').text(timeTitle);
							resolve(this);
						}.bind(this));

						break;

					case 'xsdTime':
						this._renderTime().then(function () {
							this.$el.find('.timeTitle').text(timeTitle);
							resolve(this);
						}.bind(this));
						break;

					default:
						resolve(this);
						break;
				}
			}.bind(this));
		},

		_getDateTimes: function _getDateTimes() {
			var dates = [];
			if (this.defaultValues) {
				var momentTime = moment.tz(this.defaultValues[0].d, this.DATE_TIME_FORMAT, this.timezone);
				dates.push(momentTime.toDate());
				if (this.defaultValues.length > 1) {
					var momentTime1 = moment.tz(this.defaultValues[1].d, this.DATE_TIME_FORMAT, this.timezone);
					dates.push(momentTime1.toDate());
				}
			} else {
				var currentdate = new Date();
				dates = [currentdate, currentdate];
			}

			return dates;
		},

		_renderDate: function _renderDate() {
			var dates = this._getDateTimes();

			this.$el.find('.dateContainer').css('display', 'inline-flex');

			this.startDate = new DatePicker({
				'$el': this.$el.find('.dateRowStart'),
				'labelText': '',
				'ariaLabelText': stringResources.get('dateTitle'),
				'timezone': this.timezone,
				'attributes': {
					'firstDay': 1,
					'defaultDate': dates[0],
					'inputFieldDate': dates[0]
				},
				'setOnSelect': true,
				'setDiv': this.$el
			});
			var datePickers = [];
			datePickers.push(this.startDate.render());

			if (this._isRangePrompt) {
				this.endDate = new DatePicker({
					'$el': this.$el.find('.dateRowEnd'),
					'labelText': '',
					'ariaLabelText': stringResources.get('dateTitle'),
					'timezone': this.timezone,
					'attributes': {
						'firstDay': 1,
						'defaultDate': dates[1],
						'inputFieldDate': dates[1]
					},
					'setOnSelect': false,
					'setDiv': this.$el
				});
				datePickers.push(this.endDate.render());
			}

			return Promise.all(datePickers);
		},

		_renderTime: function _renderTime() {
			this.$el.find('.timeContainer').css('display', 'inline-flex');
			var times = this._getDateTimes();

			var timepickers = [];
			this.startTime = new TimePicker({
				'$el': this.$el.find('.timeRowStart'),
				'timezone': this.timezone,
				'ariaLabel': stringResources.get('timeTitle'),
				'setDiv': this.$el,
				'attributes': {
					'minuteStep': 1,
					'showMeridian': true,
					'defaultTime': times[0]
				}
			});

			timepickers.push(this.startTime.render());

			if (this._isRangePrompt) {
				this.endTime = new TimePicker({
					'$el': this.$el.find('.timeRowEnd'),
					'timezone': this.timezone,
					'ariaLabel': stringResources.get('timeTitle'),
					'setDiv': this.$el,
					'attributes': {
						'minuteStep': 1,
						'showMeridian': true,
						'defaultTime': times[1]
					}
				});

				timepickers.push(this.endTime.render());
			}

			return Promise.all(timepickers);
		},

		_renderDateTime: function _renderDateTime() {
			return this._renderDate().then(this._renderTime.bind(this)).then(function () {
				this.$el.find('.timeContainer').css('display', 'inline-flex');
				this.$el.find('.dateContainer').css('display', 'inline-flex');

				this._iWidth = 500;

				this.$el.width(this._iWidth + 'px');
				this.$el.find('.flexFifty').css('flex', '2 33%');
			}.bind(this));
		},

		setFocus: function setFocus() {
			var element = this.startDate ? this.startDate.$el.find('input') : this.startTime.$el.find('input');
			element.focus();
		},

		/**
   * @public
   * Get prompt values from dialog.
   *
   */
		getPromptValues: function getPromptValues() {
			var values;

			switch (this.dataType) {
				case 'xsdDate':
					values = this._getDateValues();
					break;

				case 'xsdDateTime':
					values = [];
					var timeValues = this._getTimeValues();
					var dateValues = this._getDateValues();

					for (var i = 0; i < dateValues.length; i++) {
						values.push(dateValues[i] + 'T' + timeValues[i]);
					}
					break;

				case 'xsdTime':
					values = this._getTimeValues();
					break;

				default:
					break;
			}

			return values;
		},

		_getDateValues: function _getDateValues() {
			var values = [];

			if (this.startDate.isValidDate()) {
				values.push(this.startDate.getDateVal());
			}

			if (this._isRangePrompt && this.endDate.isValidDate()) {
				values.push(this.endDate.getDateVal());
			}

			return values;
		},

		_getTimeValues: function _getTimeValues() {
			var values = [];

			if (this.startTime.isValidTime()) {
				values.push(this.startTime.getTime24HShort());
			}

			if (this._isRangePrompt && this.endTime.isValidTime()) {
				values.push(this.endTime.getTime24HShort());
			}

			return values;
		}

	});

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