/**
 * EditorSettings.js
 *
 * Released under LGPL License.
 * Copyright (c) 1999-2016 Ephox Corp. All rights reserved
 *
 * License: http://www.tinymce.com/license
 * Contributing: http://www.tinymce.com/contributing
 */

define('tinymce/inlite/alien/EditorSettings', [
	'tinymce/inlite/alien/Type'
], function (Type) {
	var validDefaultOrDie = function (value, predicate) {
		if (predicate(value)) {
			return true;
		}

		throw new Error('Default value doesn\'t match requested type.');
	};

	var getByTypeOr = function (predicate) {
		return function (editor, name, defaultValue) {
			var settings = editor.settings;
			validDefaultOrDie(defaultValue, predicate);
			return name in settings && predicate(settings[name]) ? settings[name] : defaultValue;
		};
	};

	var splitNoEmpty = function (str, delim) {
		return str.split(delim).filter(function (item) {
			return item.length > 0;
		});
	};

	var itemsToArray = function (value, defaultValue) {
		var stringToItemsArray = function (value) {
			return typeof value === 'string' ? splitNoEmpty(value, /[ ,]/) : value;
		};

		var boolToItemsArray = function (value, defaultValue) {
			return value === false ? [ ] : defaultValue;
		};

		if (Type.isArray(value)) {
			return value;
		} else if (Type.isString(value)) {
			return stringToItemsArray(value);
		} else if (Type.isBoolean(value)) {
			return boolToItemsArray(value, defaultValue);
		}

		return defaultValue;
	};

	var getToolbarItemsOr = function (predicate) {
		return function (editor, name, defaultValue) {
			var value = name in editor.settings ? editor.settings[name] : defaultValue;
			validDefaultOrDie(defaultValue, predicate);
			return itemsToArray(value, defaultValue);
		};
	};

	return {
		// TODO: Add Option based getString, getBool if merged with core
		getStringOr: getByTypeOr(Type.isString),
		getBoolOr: getByTypeOr(Type.isBoolean),
		getNumberOr: getByTypeOr(Type.isNumber),
		getHandlerOr: getByTypeOr(Type.isFunction),
		getToolbarItemsOr: getToolbarItemsOr(Type.isArray)
	};
});
