
import {window, $, _, moment} from 'common';
import Translator from 'Common/Translator';

class Momentor
{
	_moment = null;
	_momentNow = 0;

	constructor()
	{
		this.updateMomentNow = _.debounce(() => {
			this._moment = moment();
		}, 500, true);

		this.updateMomentNowUnix = _.debounce(() => {
			this._momentNow = moment().unix();
		}, 500, true);

		this.format = _.bind(this.format, this);
	}

	momentNow() {
		this.updateMomentNow();
		return this._moment || moment();
	}

	momentNowUnix() {
		this.updateMomentNowUnix();
		return this._momentNow || 0;
	}

	/**
	 * @param {number} date
	 * @return {string}
	 */
	searchSubtractFormatDateHelper(date) {
		return this.momentNow().clone().subtract('days', date).format('YYYY.MM.DD');
	}

	/**
	 * @param {Object} m
	 * @return {string}
	 */
	formatCustomShortDate(m) {

		const now = this.momentNow();
		if (m && now)
		{
			switch(true)
			{
				case 4 >= now.diff(m, 'hours'):
					return m.fromNow();
				case now.format('L') === m.format('L'):
					return Translator.i18n('MESSAGE_LIST/TODAY_AT', {
						'TIME': m.format('LT')
					});
				case now.clone().subtract('days', 1).format('L') === m.format('L'):
					return Translator.i18n('MESSAGE_LIST/YESTERDAY_AT', {
						'TIME': m.format('LT')
					});
				case now.year() === m.year():
					return m.format('D MMM.');
			}
		}

		return m ? m.format('LL') : '';
	}

	/**
	 * @param {number} timeStampInUTC
	 * @param {string} format
	 * @return {string}
	 */
	format(timeStampInUTC, format) {

		let
			m = null,
			result = ''
		;

		const now = this.momentNowUnix();

		timeStampInUTC = 0 < timeStampInUTC ? timeStampInUTC : (0 === timeStampInUTC ? now : 0);
		timeStampInUTC = now < timeStampInUTC ? now : timeStampInUTC;

		m = 0 < timeStampInUTC ? moment.unix(timeStampInUTC) : null;

		if (m && 1970 === m.year())
		{
			m = null;
		}

		if (m)
		{
			switch (format)
			{
				case 'FROMNOW':
					result = m.fromNow();
					break;
				case 'SHORT':
					result = this.formatCustomShortDate(m);
					break;
				case 'FULL':
					result = m.format('LLL');
					break;
				default:
					result = m.format(format);
					break;
			}
		}

		return result;
	}

	/**
	 * @param {Object} element
	 */
	momentToNode(element) {

		var
			key = '',
			time = 0,
			$el = $(element)
		;

		time = $el.data('moment-time');
		if (time)
		{
			key = $el.data('moment-format');
			if (key)
			{
				$el.text(this.format(time, key));
			}

			key = $el.data('moment-format-title');
			if (key)
			{
				$el.attr('title', this.format(time, key));
			}
		}
	}

	/**
	 * @param {Object} elements
	 */
	momentToNodes(elements) {
		_.defer(() => {
			$('.moment', elements).each((index, item) => {
				this.momentToNode(item);
			});
		});
	}

	reload() {
		this.momentToNodes(window.document);
	}
}

module.exports = new Momentor();
