/* eslint-env amd */
define([
	'eslint/conf/environments',
	'module'
],
function(envs, module) {
	/**
	 * @fileoverview Environments manager
	 * @author Nicholas C. Zakas
	 */
	"use strict";

	//------------------------------------------------------------------------------
	// Private
	//------------------------------------------------------------------------------

	var environments = Object.create(null);

	/**
	 * Loads the default environments.
	 * @returns {void}
	 * @private
	 */
	function load() {
		Object.keys(envs).forEach(function(envName) {
			environments[envName] = envs[envName];
		});
	}

	// always load default environments upfront
	load();

	//------------------------------------------------------------------------------
	// Public Interface
	//------------------------------------------------------------------------------

	module.exports = {

		load: load,

		/**
		 * Gets the environment with the given name.
		 * @param {string} name The name of the environment to retrieve.
		 * @returns {Object?} The environment object or null if not found.
		 */
		get: function(name) {
			return environments[name] || null;
		},

		/**
		 * Defines an environment.
		 * @param {string} name The name of the environment.
		 * @param {Object} env The environment settings.
		 * @returns {void}
		 */
		define: function(name, env) {
			environments[name] = env;
		},

		/**
		 * Imports all environments from a plugin.
		 * @param {Object} plugin The plugin object.
		 * @param {string} pluginName The name of the plugin.
		 * @returns {void}
		 */
		importPlugin: function(plugin, pluginName) {
			if (plugin.environments) {
				Object.keys(plugin.environments).forEach(function(envName) {
					this.define(pluginName + "/" + envName, plugin.environments[envName]);
				}, this);
			}
		},

		/**
		 * Resets all environments. Only use for tests!
		 * @returns {void}
		 */
		testReset: function() {
			environments = Object.create(null);
			load();
		}
	};

	return module.exports;
});