const db = require('vn-print/core/database');
const Email = require('vn-print/core/email');
const closure = require('./closure');

module.exports = async function(request, response, next) {
    try {
        const reqArgs = request.query;

        if (!reqArgs.routeId)
            throw new Error('The argument routeId is required');

        response.status(200).json({
            message: 'Success'
        });

        const tickets = await db.rawSql(`
            SELECT 
                t.id,
                t.clientFk,
                c.name clientName,
                c.email recipient,
                c.salesPersonFk,
                c.isToBeMailed,
                c.hasToInvoice,
                co.hasDailyInvoice,
                eu.email salesPersonEmail
            FROM expedition e
                JOIN ticket t ON t.id = e.ticketFk
                JOIN ticketState ts ON ts.ticketFk = t.id
                JOIN alertLevel al ON al.id = ts.alertLevel
                JOIN client c ON c.id = t.clientFk
                JOIN province p ON p.id = c.provinceFk
                JOIN country co ON co.id = p.countryFk
                LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
            WHERE al.code = 'PACKED'
                AND t.routeFk = ?
                AND t.refFk IS NULL
            GROUP BY e.ticketFk`, [reqArgs.routeId]);

        await closure.start(tickets, response.locals);

        // Send route report to the agency
        const agencyMail = await db.findValue(`
            SELECT am.reportMail 
                FROM route r
                    JOIN agencyMode am ON am.id = r.agencyModeFk
                WHERE r.id = ?`, [reqArgs.routeId]);

        if (agencyMail) {
            const args = Object.assign({
                routeId: Number.parseInt(reqArgs.routeId),
                recipient: agencyMail
            }, response.locals);

            const email = new Email('driver-route', args);
            await email.send();
        }
    } catch (error) {
        next(error);
    }
};