const crypto = require('crypto');

module.exports = Self => {
    require('../methods/tpv-transaction/confirm')(Self);
    require('../methods/tpv-transaction/start')(Self);
    require('../methods/tpv-transaction/end')(Self);

    Self.createSignature = function(orderId, secretKey, merchantParameters) {
        secretKey = Buffer.from(secretKey, 'base64');
        const iv = Buffer.alloc(8, 0);

        const cipher = crypto.createCipheriv('des-ede3-cbc', secretKey, iv);
        cipher.setAutoPadding(false);
        const orderKey = Buffer.concat([
            cipher.update(zeroPad(orderId, 8)),
            cipher.final()
        ]);

        return crypto.createHmac('sha256', orderKey)
            .update(merchantParameters)
            .digest('base64');
    };

    function zeroPad(buf, blocksize) {
        const buffer = typeof buf === 'string' ? Buffer.from(buf, 'utf8') : buf;
        const pad = Buffer.alloc((blocksize - (buffer.length % blocksize)) % blocksize, 0);
        return Buffer.concat([buffer, pad]);
    }
};