var _           = require('underscore'),
    when        = require('when'),
    ghostApi,
    loader      = require('./loader'),
    GhostPlugin = require('./GhostPlugin');

function getInstalledPlugins() {
    if (!ghostApi) {
        ghostApi = require('../api');
    }

    return ghostApi.settings.read('installedPlugins').then(function (installed) {
        installed.value = installed.value || '[]';

        try {
            installed = JSON.parse(installed.value);
        } catch (e) {
            return when.reject(e);
        }

        return installed;
    });
}

function saveInstalledPlugins(installedPlugins) {
    return getInstalledPlugins().then(function (currentInstalledPlugins) {
        var updatedPluginsInstalled = _.uniq(installedPlugins.concat(currentInstalledPlugins));

        return ghostApi.settings.edit('installedPlugins', updatedPluginsInstalled);
    });
}

module.exports = {
    GhostPlugin: GhostPlugin,

    init: function (ghost, pluginsToLoad) {
        // Grab all installed plugins, install any not already installed that are in pluginsToLoad.
        return getInstalledPlugins().then(function (installedPlugins) {
            var loadedPlugins = {},
                recordLoadedPlugin = function (name, loadedPlugin) {
                    // After loading the plugin, add it to our hash of loaded plugins
                    loadedPlugins[name] = loadedPlugin;

                    return when.resolve(loadedPlugin);
                },
                loadPromises = _.map(pluginsToLoad, function (plugin) {
                    // If already installed, just activate the plugin
                    if (_.contains(installedPlugins, plugin)) {
                        return loader.activatePluginByName(plugin, ghost).then(function (loadedPlugin) {
                            return recordLoadedPlugin(plugin, loadedPlugin);
                        });
                    }

                    // Install, then activate the plugin
                    return loader.installPluginByName(plugin, ghost).then(function () {
                        return loader.activatePluginByName(plugin, ghost);
                    }).then(function (loadedPlugin) {
                        return recordLoadedPlugin(plugin, loadedPlugin);
                    });
                });

            return when.all(loadPromises).then(function () {
                // Save our installed plugins to settings
                return saveInstalledPlugins(_.keys(loadedPlugins));
            }).then(function () {
                // Return the hash of all loaded plugins
                return when.resolve(loadedPlugins);
            });
        });
    }
};