const Unit = require('libflitter/Unit')
const Express = require('express')
const path = require('path')

/**
 * FrontendUnit
 * ----------------------------------------------------------------------------------------
 * A Flitter application unit which sets up routes for accessing the javascript front-end
 * pages we created in Project 3.
 *
 * @extends Unit
 */
class FrontendUnit extends Unit {
    static get services() {
        return [...super.services, 'configs', 'express', 'canon', 'utility', 'models']
    }

    constructor(...args) {
        super(...args)

        /**
         * Fully qualified path to the root of the ionic app.
         * @type {string}
         */
        this.directory = this.utility.path(this.configs.get('server.frontend_path'))
    }

    /**
     * Initializes the unit. Creates the `/app` static endpoing and default settings.
     * @param {FlitterApp} app
     */
    async go(app) {
        app.express.use('/app', [
            this.canon.get('middleware::auth:UserOnly'),
            (req, res, next) => {
                if ( !req.user ) {
                    return res.redirect('/auth/login')
                }

                const allowed_extensions = [
                    '.html', '.js', '.css', '.svg', '.ttf', '.jpg', '.png',
                    '.jpeg', '.webmanifest', '.json', '.eot', '.svg', '.cur',
                    '.webp', '.gif', '.otf', '.woff', '.woff2', '.ani', '.map',
                    '.ico',
                ]

                for ( const k1 in allowed_extensions ) {
                    if ( req.path.endsWith(allowed_extensions[k1]) ) return next()
                }

                return res.sendFile(path.resolve(this.directory, 'index.html'))
            },
            Express.static(this.directory),
        ])

        // Set the default setting values
        const Setting = this.models.get('models::setting')  // a built-in helper
        const default_settings = this.configs.get('settings.default_settings') || []

        for ( const default_setting of default_settings ) {
            await Setting.guarantee(default_setting.key, default_setting.value)
        }
    }
}

module.exports = exports = FrontendUnit
