const db = require('../core/database');
const Email = require('../core/email');
const smtp = require('../core/smtp');
const config = require('../core/config');

module.exports = app => {
    app.get('/api/closure', async function(req, res) {
        const failedtickets = [];
        const tickets = await db.rawSql(`
            SELECT 
                t.id,
                t.clientFk,
                c.email recipient
            FROM expedition e
                JOIN ticket t ON t.id = e.ticketFk
                JOIN client c ON c.id = t.clientFk
                JOIN warehouse w ON w.id = t.warehouseFk AND hasComission
                LEFT JOIN ticketState ts ON ts.ticketFk = t.id
            WHERE ts.code = 'PACKED'
                AND DATE(t.shipped) BETWEEN DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND CURDATE()
                AND t.refFk IS NULL
            GROUP BY e.ticketFk`);

        for (const ticket of tickets) {
            try {
                await db.rawSql(`CALL vn.ticketClosureTicket(:ticketId)`, {
                    ticketId: ticket.id
                });

                const args = {
                    ticketId: ticket.id,
                    clientId: ticket.clientFk,
                    recipient: ticket.recipient
                };
                const email = new Email('delivery-note-link', args);
                await email.send();
            } catch (error) {
                // Save tickets on a list of failed ids
                failedtickets.push({
                    id: ticket.id,
                    stacktrace: error
                });
            }
        }

        // Send email with failed tickets
        if (failedtickets.length > 0) {
            let body = 'This following tickets has failed:<br/><br/>';

            for (ticket of failedtickets) {
                body += `Ticket: <strong>${ticket.id}</strong>
                    <br/> <strong>${ticket.stacktrace}</strong><br/><br/>`;
            }

            smtp.send({
                to: config.app.reportEmail,
                subject: '[API] Nightly ticket closure has failed',
                html: body
            });
        }

        res.status(200).json({
            message: 'Closure executed successfully'
        });
    });
};