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

class IonicUnit extends Unit {
    static get services() {
        return [...super.services, 'configs', 'express', 'canon', 'utility', 'scaffold']
    }

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

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

    async go(app) {
        app.express.use(cors())

        app.express.use('/i', [
            this.canon.get('middleware::auth:UserOnly'),
            (req, res, next) => {
                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),
        ])

        // Create the full-text search indices
        const pages = this.scaffold.collection('api_Page')
        await pages.createIndex({ Name: 'text' })

        const nodes = this.scaffold.collection('api_Node')
        await nodes.createIndex({ 'Value.Value': 'text' })

        const databases = this.scaffold.collection('api_db_Database')
        await databases.createIndex({ Name: 'text' })

        const codiums = this.scaffold.collection('api_Codium')
        await codiums.createIndex({ code: 'text' })

        const files = this.scaffold.collection('upload__File')
        await files.createIndex({ original_name: 'text' })
    }
}

module.exports = exports = IonicUnit
