const smtp = require('vn-print/core/smtp');
const config = require('vn-print/core/config');

module.exports = Self => {
    Self.remoteMethodCtx('sendToSupport', {
        description: 'Send mail to support',
        accessType: 'WRITE',
        accepts: [
            {
                arg: 'reason',
                type: 'string',
                description: 'The reason'
            },
            {
                arg: 'additionalData',
                type: 'object',
                required: true,
                description: 'The additional data'
            }
        ],
        returns: {
            type: 'object',
            root: true
        },
        http: {
            path: `/send-to-support`,
            verb: 'POST'
        }
    });

    Self.sendToSupport = async(ctx, reason, additionalData) => {
        const emailUser =
            await Self.app.models.EmailUser.findById(ctx.req.accessToken.userId, {fields: ['email']});

        let html = `<strong>Motivo</strong>:<br/>${reason}<br/>`;
        html += `<strong>Usuario</strong>:<br/>${ctx.req.accessToken.userId} ${emailUser.email}<br/>`;

        delete additionalData.backError.config.headers.Authorization;
        const httpRequest = JSON.parse(additionalData?.httpRequest);

        if (httpRequest)
            delete httpRequest.config.headers.Authorization;
        additionalData.httpRequest = httpRequest;

        for (const data in additionalData)
            html += `<strong>${data}</strong>:<br/>${tryParse(additionalData[data])}<br/>`;

        const subjectReason = httpRequest?.data?.error;
        await smtp.send({
            to: `${config.app.reportEmail}, ${emailUser.email}`,
            subject:
                '[Support-Salix] ' +
                additionalData?.frontPath + ' ' +
                subjectReason?.name + ':' +
                subjectReason?.message,
            html
        });
    };

    function tryParse(value) {
        try {
            try {
                value = JSON.parse(value);
            } catch {}
            return JSON.stringify(value, null, '&nbsp;').split('\n').join('<br>');
        } catch {
            return value;
        }
    }
};