const Report = require('../core/report');

module.exports = app => {
    app.get(`/api/report/:name`, async(req, res, next) => {
        try {
            const reportName = req.params.name;
            const fileName = getFileName(reportName, req.args);
            const report = new Report(reportName, req.args);
            if (req.args.preview) {
                const template = await report.render();
                res.send(template);
            } else {
                const stream = await report.toPdfStream();

                res.setHeader('Content-type', 'application/pdf');
                res.setHeader('Content-Disposition', `inline; filename="${fileName}"`);
                res.end(stream);
            }
        } catch (error) {
            next(error);
        }
    });

    /**
     * Returns all the params that ends with id
     * @param {object} args - Params object
     *
     * @return {array} List of identifiers
     */
    function getIdentifiers(args) {
        const identifiers = [];
        const keys = Object.keys(args);

        for (let arg of keys) {
            if (arg.endsWith('Id'))
                identifiers.push(arg);
        }

        return identifiers;
    }

    function getFileName(name, args) {
        const identifiers = getIdentifiers(args);
        const params = [];
        params.push(name);

        for (let id of identifiers)
            params.push(args[id]);

        const fileName = params.join('_');

        return `${fileName}.pdf`;
    }
};