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

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

module.exports = async app => {
    global.appPath = __dirname;

    process.env.OPENSSL_CONF = '/etc/ssl/';

    // Extended locale intl polyfill
    const IntlPolyfill = require('intl');
    Intl.NumberFormat = IntlPolyfill.NumberFormat;
    Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;

    // Init database instance
    require('./core/database').init();
    // Init SMTP Instance
    require('./core/smtp').init();
    require('./core/mixins');
    require('./core/filters');
    require('./core/directives');
    // Init router
    require('./core/router')(app);

    /**
     * Serve component static files
     */
    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));
        });
    });

    // Instantiate Puppeteer browser
    async function launchBrowser() {
        config.browser = await puppeteer.launch({
            headless: true,
            args: ['--no-sandbox', '--disable-setuid-sandbox']
        });

        config.browser.on('disconnected', launchBrowser);
    }

    launchBrowser();
};