const shared = require('../shared');
const localUtils = require('./utils');

// ESLint Override Notice
// This is a valid index.js file - it just exports a lot of stuff!
// Long term we would like to change the API architecture to reduce this file,
// but that's not the problem the index.js max - line eslint "proxy" rule is there to solve.
/* eslint-disable max-lines */

module.exports = {
    get http() {
        return shared.http;
    },

    get authentication() {
        return shared.pipeline(require('./authentication'), localUtils);
    },

    get db() {
        return shared.pipeline(require('./db'), localUtils);
    },

    get identities() {
        return shared.pipeline(require('./identities'), localUtils);
    },

    get integrations() {
        return shared.pipeline(require('./integrations'), localUtils);
    },

    // @TODO: transform
    get session() {
        return require('./session');
    },

    get schedules() {
        return shared.pipeline(require('./schedules'), localUtils);
    },

    get pages() {
        return shared.pipeline(require('./pages'), localUtils);
    },

    get redirects() {
        return shared.pipeline(require('./redirects'), localUtils);
    },

    get roles() {
        return shared.pipeline(require('./roles'), localUtils);
    },

    get slugs() {
        return shared.pipeline(require('./slugs'), localUtils);
    },

    get webhooks() {
        return shared.pipeline(require('./webhooks'), localUtils);
    },

    get posts() {
        return shared.pipeline(require('./posts'), localUtils);
    },

    get invites() {
        return shared.pipeline(require('./invites'), localUtils);
    },

    get mail() {
        return shared.pipeline(require('./mail'), localUtils);
    },

    get notifications() {
        return shared.pipeline(require('./notifications'), localUtils);
    },

    get settings() {
        return shared.pipeline(require('./settings'), localUtils);
    },

    get membersStripeConnect() {
        return shared.pipeline(require('./membersStripeConnect'), localUtils);
    },

    get members() {
        return shared.pipeline(require('./members'), localUtils);
    },

    get offers() {
        return shared.pipeline(require('./offers'), localUtils);
    },

    get products() {
        return shared.pipeline(require('./products'), localUtils);
    },

    get memberSigninUrls() {
        return shared.pipeline(require('./memberSigninUrls.js'), localUtils);
    },

    get labels() {
        return shared.pipeline(require('./labels'), localUtils);
    },

    get images() {
        return shared.pipeline(require('./images'), localUtils);
    },

    get media() {
        return shared.pipeline(require('./media'), localUtils);
    },

    get files() {
        return shared.pipeline(require('./files'), localUtils);
    },

    get tags() {
        return shared.pipeline(require('./tags'), localUtils);
    },

    get users() {
        return shared.pipeline(require('./users'), localUtils);
    },

    get preview() {
        return shared.pipeline(require('./preview'), localUtils);
    },

    get emailPost() {
        return shared.pipeline(require('./email-post'), localUtils);
    },

    get oembed() {
        return shared.pipeline(require('./oembed'), localUtils);
    },

    get slack() {
        return shared.pipeline(require('./slack'), localUtils);
    },

    get config() {
        return shared.pipeline(require('./config'), localUtils);
    },

    get themes() {
        return shared.pipeline(require('./themes'), localUtils);
    },

    get actions() {
        return shared.pipeline(require('./actions'), localUtils);
    },

    get email_preview() {
        return shared.pipeline(require('./email-preview'), localUtils);
    },

    get emails() {
        return shared.pipeline(require('./email'), localUtils);
    },

    get site() {
        return shared.pipeline(require('./site'), localUtils);
    },

    get snippets() {
        return shared.pipeline(require('./snippets'), localUtils);
    },

    get customThemeSettings() {
        return shared.pipeline(require('./custom-theme-settings'), localUtils);
    },

    get serializers() {
        return require('./utils/serializers');
    },

    /**
     * Content API Controllers
     *
     * @NOTE:
     *
     * Please create separate controllers for Content & Admin API. The goal is to expose `api.canary.content` and
     * `api.canary.admin` soon. Need to figure out how serializers & validation works then.
     */
    get pagesPublic() {
        return shared.pipeline(require('./pages-public'), localUtils, 'content');
    },

    get tagsPublic() {
        return shared.pipeline(require('./tags-public'), localUtils, 'content');
    },

    get publicSettings() {
        return shared.pipeline(require('./settings-public'), localUtils, 'content');
    },

    get postsPublic() {
        return shared.pipeline(require('./posts-public'), localUtils, 'content');
    },

    get authorsPublic() {
        return shared.pipeline(require('./authors-public'), localUtils, 'content');
    },

    get productsPublic() {
        return shared.pipeline(require('./products-public'), localUtils, 'content');
    }
};