/* eslint max-len: ["error", { "code": 180 }]*/
const axios = require('axios');
const UserError = require('vn-loopback/util/user-error');

module.exports = Self => {
    Self.remoteMethod('download', {
        description: 'Download an docuware PDF',
        accessType: 'READ',
        accepts: [
            {
                arg: 'id',
                type: 'number',
                description: 'The ticket id',
                http: {source: 'path'}
            },
            {
                arg: 'fileCabinet',
                type: 'string',
                description: 'The file cabinet'
            },
            {
                arg: 'filter',
                type: 'object',
                description: 'The filter'
            }
        ],
        returns: [
            {
                arg: 'body',
                type: 'file',
                root: true
            }, {
                arg: 'Content-Type',
                type: 'string',
                http: {target: 'header'}
            }, {
                arg: 'Content-Disposition',
                type: 'string',
                http: {target: 'header'}
            }
        ],
        http: {
            path: `/:id/download`,
            verb: 'GET'
        },
        accessScopes: ['DEFAULT', 'read:multimedia']
    });

    Self.download = async function(id, fileCabinet, filter) {
        const models = Self.app.models;

        const docuwareFile = await models.Docuware.checkFile(id, fileCabinet, filter);
        if (!docuwareFile) throw new UserError('The DOCUWARE PDF document does not exists');

        const fileCabinetId = await Self.getFileCabinet(fileCabinet);
        const options = await Self.getOptions();
        options.headers.responseType = 'stream';

        const fileName = `filename="${id}.pdf"`;
        const contentType = 'application/pdf';
        const downloadUri = `${options.url}/FileCabinets/${fileCabinetId}/Documents/${docuwareFile.id}/FileDownload?targetFileType=Auto&keepAnnotations=false`;

        const stream = await axios.get(downloadUri, options.headers);

        return [stream.data, contentType, fileName];
    };
};