'use strict';

const _ = require('lodash')
const auth = require('http-auth');
const bodyParser = require('body-parser');
const compress = require('compression');
const express = require('express');
const fs = require('graceful-fs')

const config = require('./config').config

const app = express();

module.exports = (() => {
    const router = express.Router();

    // urls beneath /internal are protected
    const internalAuth = auth.basic(
        {
            realm: 'Knotenformular - Intern'
        },
        function (username, password, callback) {
            callback(
                config.server.internal.active &&
                username === config.server.internal.user &&
                password === config.server.internal.password
            );
        }
    );
    router.use('/internal', auth.connect(internalAuth));

    router.use(bodyParser.json());
    router.use(bodyParser.urlencoded({ extended: true }));

    const adminDir = __dirname + '/../admin';
    const clientDir = __dirname + '/../client';
    const templateDir = __dirname + '/templates';

    const jsTemplateFiles = [
        '/config.js'
    ];

    router.use(compress());

    function serveTemplate (mimeType, req, res, next) {
        return fs.readFile(templateDir + '/' + req.path, 'utf8', function (err, body) {
            if (err) {
                return next(err);
            }

            res.writeHead(200, { 'Content-Type': mimeType });
            res.end(_.template(body)({ config: config.client }));

            return null; // to suppress warning
        });
    }

    router.use(function (req, res, next) {
        if (jsTemplateFiles.indexOf(req.path) >= 0) {
            return serveTemplate('application/javascript', req, res, next);
        }
        return next();
    });

    router.use('/internal/admin', express.static(adminDir + '/'));
    router.use('/', express.static(clientDir + '/'));

    app.use(config.server.rootPath, router);

    return app;
})()