/* --------------------------------------------------------------
 info_box.js 2019-07-12
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2019 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

jse.libs.info_box = jse.libs.info_box || {};

/**
 * ## Info Box Messages Library
 *
 * This module provides an API to the new admin layout pages info box.
 *
 * @module Admin/Libs/info_box
 * @exports jse.libs.info_box
 */
(function(exports) {
	
	'use strict';
	
	// Admin info box element selector.
	const infoboxSelector = '.info-box';
	
	/**
	 * Performs an ajax request to the server.
	 *
	 * @param {String} action URL action part.
	 * @param {String} method HTTP request method.
	 * @param {Object} data   Request data.
	 *
	 * @return {Deferred|Promise}
	 *
	 * @private
	 */
	function _performRequest(action, method, data) {
		const URL_BASE = 'admin.php?do=AdminInfoBoxAjax';
		
		// AJAX request options.
		const ajaxOptions = {
			url: URL_BASE + action,
			dataType: 'json',
			data,
			method
		};
		
		// Returns deferred object.
		const returnObj = $.ajax(ajaxOptions);
		const newInfobox = document.querySelector('#gx-header .infobox');
		if (newInfobox) {
			newInfobox.dispatchEvent(new Event('update-messages'));
		}
		
		return returnObj;
	}
	
	// Message status.
	exports.STATUS_NEW = 'new';
	exports.STATUS_READ = 'read';
	exports.STATUS_HIDDEN = 'hidden';
	exports.STATUS_DELETED = 'deleted';
	
	// Message types.
	exports.TYPE_INFO = 'info';
	exports.TYPE_WARNING = 'warning';
	exports.TYPE_SUCCESS = 'success';
	
	// Message visibility.
	exports.VISIBILITY_ALWAYS_ON = 'alwayson';
	exports.VISIBILITY_HIDEABLE = 'hideable';
	exports.VISIBILITY_REMOVABLE = 'removable';
	
	// Admin action success message identifier prefix.
	exports.SUCCESS_MSG_IDENTIFIER_PREFIX = 'adminActionSuccess-';
	
	/**
	 * Returns the messages from the server (visible only).
	 *
	 * @return {Promise}
	 */
	exports.getMessages = function() {
		return _performRequest('/GetAllMessages', 'GET');
	};
	
	/**
	 * Sets the status of a message.
	 *
	 * @param {Number} id Message ID.
	 * @param {String} status Message status to set ('new', 'read', 'hidden', 'deleted').
	 *
	 * @return {Promise}
	 */
	exports.setStatus = function(id, status) {
		// Valid message status.
		const validStatus = [exports.STATUS_NEW, exports.STATUS_READ, exports.STATUS_HIDDEN, exports.STATUS_DELETED];
		
		// Check arguments.
		if (!id || !status) {
			throw new Error('Missing ID or status');
		} else if (validStatus.indexOf(status) === -1) {
			throw new Error('Invalid status provided');
		}
		
		return _performRequest('/SetMessageStatus', 'GET', {id, status})
	};
	
	/**
	 * Deletes a message.
	 *
	 * @param {Number} id Message ID.
	 *
	 * @return {Promise}
	 */
	exports.deleteById = function(id) {
		if (!id) {
			throw new Error('Missing ID');
		}
		
		return _performRequest('/DeleteById', 'GET', {id});
	};
	
	/**
	 * Deletes a message by source.
	 *
	 * @param {String} source Message source.
	 *
	 * @return {Promise}
	 */
	exports.deleteBySource = function(source) {
		if (!source) {
			throw new Error('Missing source');
		}
		
		return _performRequest('/DeleteBySource', 'GET', {source});
	};
	
	/**
	 * Deletes a messages by the identifier.
	 *
	 * @param {String} identifier Message identifier.
	 *
	 * @return {Promise}
	 */
	exports.deleteByIdentifier = function(identifier) {
		if (!identifier) {
			throw new Error('Missing identifier');
		}
		
		return _performRequest('/DeleteByIdentifier', 'GET', {identifier});
	};
	
	/**
	 * Reactivates the messages.
	 * @return {Promise}
	 * @static
	 */
	exports.Reactivates = function() {
		return _performRequest('/ReactivateMessages', 'GET');
	};
	
	/**
	 * Saves a new message.
	 *
	 * @param {Object} message The new message to save.
	 *
	 * @example
	 * jse.libs.info_box.addMessage({
	 *   source: 'ajax',
	 *   identifier: 'asdas',
	 *   status: 'new',
	 *   type: 'success',
	 *   visibility: 'removable',
	 *   customerId: 0,
	 *   headline: 'My Headline',
	 *   buttonLabel: 'asdas',
	 *   buttonLink: 'http://google.com', // optional
	 *	 buttonLink: 'customers.php', // optional
	 *   message: 'Hallo!',
	 * });
	 *
	 * @return {Promise}
	 */
	exports.addMessage = function(message) {
		if (!message) {
			throw new Error('Missing message object');
		} else if (!message.source) {
			throw new Error('Missing source');
		} else if (!message.identifier) {
			message.identifier = 'generated-' + Date.now();
		} else if (!message.status || [
			exports.STATUS_NEW, exports.STATUS_READ, exports.STATUS_HIDDEN,
			exports.STATUS_DELETED
		].indexOf(message.status) === -1) {
			throw new Error('Missing or invalid status');
		} else if (!message.type || [
			exports.TYPE_INFO, exports.TYPE_WARNING,
			exports.TYPE_SUCCESS
		].indexOf(message.type) === -1) {
			throw new Error('Missing or invalid type');
		} else if (!message.visibility || [
			exports.VISIBILITY_ALWAYS_ON, exports.VISIBILITY_HIDEABLE,
			exports.VISIBILITY_REMOVABLE
		].indexOf(message.visibility) === -1) {
			throw new Error('Missing or invalid visibility');
		} else if (typeof message.customerId === 'undefined') {
			throw new Error('Missing customer ID');
		} else if (!message.message) {
			throw new Error('Missing message');
		} else if (!message.headline) {
			throw new Error('Missing headline');
		} else if (!message.message) {
			throw new Error('Missing message');
		}
		message.title = message.headline;
		
		const SEND_INFO_BOX_MESSAGE = 'gx-admin:send-info-box-message';
		window.dispatchEvent(new CustomEvent(SEND_INFO_BOX_MESSAGE, {detail: message}));
	};
	
	/**
	 * Adds a success message to the admin info box.
	 *
	 * @param {String} [message] Message to show.
	 * @param {Boolean} [skipRefresh = false] Refresh the admin info box to show the message?
	 */
	exports.addSuccessMessage = function(message, skipRefresh = false) {
		const SEND_INFO_BOX_SUCCESS_MESSAGE = 'gx-admin:send-info-box-success-message';
		
		window.dispatchEvent(new CustomEvent(SEND_INFO_BOX_SUCCESS_MESSAGE, {detail: {message}}));
	};
}(jse.libs.info_box));