var fs = require('fs'),
    Promise = require('bluebird'),
    path = require('path'),
    parsePackageJson = require('../require-tree').parsePackageJson;

function AppPermissions(appPath) {
    this.appPath = appPath;
    this.packagePath = path.join(this.appPath, 'package.json');
}

AppPermissions.prototype.read = function () {
    var self = this;

    return this.checkPackageContentsExists().then(function (exists) {
        if (!exists) {
            // If no package.json, return default permissions
            return Promise.resolve(AppPermissions.DefaultPermissions);
        }

        // Read and parse the package.json
        return self.getPackageContents().then(function (parsed) {
            // If no permissions in the package.json then return the default permissions.
            if (!(parsed.ghost && parsed.ghost.permissions)) {
                return Promise.resolve(AppPermissions.DefaultPermissions);
            }

            // TODO: Validation on permissions object?

            return Promise.resolve(parsed.ghost.permissions);
        });
    });
};

AppPermissions.prototype.checkPackageContentsExists = function () {
    var self = this;

    // Mostly just broken out for stubbing in unit tests
    return new Promise(function (resolve) {
        fs.stat(self.packagePath, function (err) {
            var exists = !err;
            resolve(exists);
        });
    });
};

// Get the contents of the package.json in the appPath root
AppPermissions.prototype.getPackageContents = function () {
    var messages = {
        errors: [],
        warns: []
    };

    return parsePackageJson(this.packagePath, messages)
        .then(function (parsed) {
            if (!parsed) {
                return Promise.reject(new Error(messages.errors[0].message));
            }

            return parsed;
        });
};

// Default permissions for an App.
AppPermissions.DefaultPermissions = {
    posts: ['browse', 'read']
};

module.exports = AppPermissions;