module.exports = Self => {
    /**
     * Checks if current user has
     * read privileges over a collection
     *
     * @param {object} ctx - Request context
     * @param {interger} name - Collection name
     * @param {object} options - Query options
     * @return {boolean} True for user with read privileges
     */
    Self.hasReadRole = async(ctx, name, options) => {
        const collection = await Self.findOne({where: {name}}, {
            include: {
                relation: 'readRole'
            }
        }, options);

        return await hasRole(ctx, collection, options);
    };

    /**
     * Checks if current user has
     * write privileges over a collection
     *
     * @param {object} ctx - Request context
     * @param {string} name - Collection name
     * @param {object} options - Query options
     * @return {boolean} True for user with write privileges
     */
    Self.hasWriteRole = async(ctx, name, options) => {
        const collection = await Self.findOne({
            include: {
                relation: 'writeRole'
            },
            where: {name}
        }, options);

        return await hasRole(ctx, collection, options);
    };

    /**
     * Checks if current user has
     * read or write privileges
     * @param {Object} ctx - Context
     * @param {Object} collection - Collection [read/write]
     * @param {Object} options - Query options
     */
    async function hasRole(ctx, collection, options) {
        const models = Self.app.models;
        const myUserId = ctx.req.accessToken.userId;

        const readRole = collection.readRole() && collection.readRole().name;
        const writeRole = collection.writeRole() && collection.writeRole().name;
        const requiredRole = readRole || writeRole;

        const hasRequiredRole = await models.Account.hasRole(myUserId, requiredRole, options);
        const isRoot = await models.Account.hasRole(myUserId, 'root', options);

        if (isRoot || hasRequiredRole)
            return true;

        return false;
    }
};