const UserError = require('vn-loopback/util/user-error');

module.exports = Self => {
    Self.remoteMethodCtx('payBack', {
        description: 'Create ticket with the selected lines changing the sign to the quantites',
        accessType: 'WRITE',
        accepts: [{
            arg: 'sales',
            description: 'The sales',
            type: ['object'],
            required: true
        },
        {
            arg: 'ticketId',
            type: 'number',
            required: true,
            description: 'The ticket id'
        }],
        returns: {
            type: 'number',
            root: true
        },
        http: {
            path: `/payBack`,
            verb: 'post'
        }
    });

    Self.payBack = async(ctx, sales, ticketId, options) => {
        const myOptions = {};
        let tx;

        if (typeof options == 'object')
            Object.assign(myOptions, options);

        if (!myOptions.transaction) {
            tx = await Self.beginTransaction({});
            myOptions.transaction = tx;
        }

        try {
            const salesIds = [];
            const userId = ctx.req.accessToken.userId;

            const isClaimManager = await Self.app.models.Account.hasRole(userId, 'claimManager');
            const isSalesAssistant = await Self.app.models.Account.hasRole(userId, 'salesAssistant');
            const hasValidRole = isClaimManager || isSalesAssistant;

            if (!hasValidRole)
                throw new UserError(`You don't have privileges to create pay back`);

            for (let sale of sales)
                salesIds.push(sale.id);

            const query = `
                DROP TEMPORARY TABLE IF EXISTS tmp.sale;
                CREATE TEMPORARY TABLE tmp.sale
                    SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount
                        FROM sale s
                        WHERE s.id IN (?);
                CALL vn.ticket_doRefund(?, @newTicket);
                DROP TEMPORARY TABLE tmp.sale;`;

            await Self.rawSql(query, [salesIds, ticketId], myOptions);
            const [newTicket] = await Self.rawSql('SELECT @newTicket id', null, myOptions);
            ticketId = newTicket.id;

            if (tx) await tx.commit();

            return ticketId;
        } catch (e) {
            if (tx) await tx.rollback();
            throw e;
        }
    };
};