const express = require('express');
const path = require('path');
const fs = require('fs');

const templatesPath = path.resolve(__dirname, './templates');
const componentsPath = path.resolve(__dirname, './core/components');

module.exports = {
    async boot(app) {
        // Extended locale intl polyfill
        const IntlPolyfill = require('intl');
        Intl.NumberFormat = IntlPolyfill.NumberFormat;
        Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;

        // Init database instance
        require('./core/database').init(app.dataSources);
        require('./core/smtp').init();
        require('./core/cluster').init();
        require('./core/mixins');
        require('./core/filters');

        const componentsDir = fs.readdirSync(componentsPath);
        componentsDir.forEach(componentName => {
            const componentDir = path.join(componentsPath, '/', componentName);
            const assetsDir = `${componentDir}/assets`;

            app.use(`/api/${componentName}/assets`, express.static(assetsDir));
        });

        /**
         * Serve static files
         */
        const templatesDir = fs.readdirSync(templatesPath);
        templatesDir.forEach(directory => {
            const templateTypeDir = path.join(templatesPath, '/', directory);
            const templates = fs.readdirSync(templateTypeDir);

            templates.forEach(templateName => {
                const templateDir = path.join(templatesPath, '/', directory, '/', templateName);
                const assetsDir = `${templateDir}/assets`;

                app.use(`/api/${templateName}/assets`, express.static(assetsDir));
            });
        });

        return true;
    },
    Email: require('./core/email'),
    Report: require('./core/report'),
    storage: require('./core/storage'),
    smtp: require('./core/smtp'),
    db: require('./core/database')
};