// # DB API
// API for DB operations
var _                = require('lodash'),
    Promise          = require('bluebird'),
    dataExport       = require('../data/export'),
    importer         = require('../data/importer'),
    models           = require('../models'),
    errors           = require('../errors'),
    utils            = require('./utils'),
    pipeline         = require('../utils/pipeline'),

    api              = {},
    docName      = 'db',
    db;

api.settings         = require('./settings');

/**
 * ## DB API Methods
 *
 * **See:** [API Methods](index.js.html#api%20methods)
 */
db = {
    /**
     * ### Export Content
     * Generate the JSON to export
     *
     * @public
     * @param {{context}} options
     * @returns {Promise} Ghost Export JSON format
     */
    exportContent: function (options) {
        var tasks = [];

        options = options || {};

        // Export data, otherwise send error 500
        function exportContent() {
            return dataExport().then(function (exportedData) {
                return {db: [exportedData]};
            }).catch(function (error) {
                return Promise.reject(new errors.InternalServerError(error.message || error));
            });
        }

        tasks = [
            utils.handlePermissions(docName, 'exportContent'),
            exportContent
        ];

        return pipeline(tasks, options);
    },
    /**
     * ### Import Content
     * Import posts, tags etc from a JSON blob
     *
     * @public
     * @param {{context}} options
     * @returns {Promise} Success
     */
    importContent: function (options) {
        var tasks = [];

        options = options || {};

        function validate(options) {
            // Check if a file was provided
            if (!utils.checkFileExists(options, 'importfile')) {
                return Promise.reject(new errors.NoPermissionError('Please select a file to import.'));
            }

            // Check if the file is valid
            if (!utils.checkFileIsValid(options.importfile, importer.getTypes(), importer.getExtensions())) {
                return Promise.reject(new errors.UnsupportedMediaTypeError(
                    'Unsupported file. Please try any of the following formats: ' +
                        _.reduce(importer.getExtensions(), function (memo, ext) {
                            return memo ? memo + ', ' + ext : ext;
                        })
                ));
            }

            return options;
        }

        function importContent(options) {
            return importer.importFromFile(options.importfile)
                .then(api.settings.updateSettingsCache)
                .return({db: []});
        }

        tasks = [
            validate,
            utils.handlePermissions(docName, 'importContent'),
            importContent
        ];

        return pipeline(tasks, options);
    },
    /**
     * ### Delete All Content
     * Remove all posts and tags
     *
     * @public
     * @param {{context}} options
     * @returns {Promise} Success
     */
    deleteAllContent: function (options) {
        var tasks;

        options = options || {};

        function deleteContent() {
            return Promise.resolve(models.deleteAllContent())
                .return({db: []})
                .catch(function (error) {
                    return Promise.reject(new errors.InternalServerError(error.message || error));
                });
        }

        tasks = [
            utils.handlePermissions(docName, 'deleteAllContent'),
            deleteContent
        ];

        return pipeline(tasks, options);
    }
};

module.exports = db;