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

module.exports = Self => {
    Self.remoteMethodCtx('upload', {
        description: 'Upload an docuware PDF',
        accessType: 'WRITE',
        accepts: [
            {
                arg: 'id',
                type: 'number',
                description: 'The ticket id',
                http: {source: 'path'}
            },
            {
                arg: 'fileCabinet',
                type: 'string',
                description: 'The file cabinet'
            },
            {
                arg: 'dialog',
                type: 'string',
                description: 'The dialog'
            }
        ],
        returns: [],
        http: {
            path: `/:id/upload`,
            verb: 'POST'
        }
    });

    Self.upload = async function(ctx, id, fileCabinet) {
        const models = Self.app.models;
        const action = 'store';

        const options = await Self.getOptions();
        const fileCabinetId = await Self.getFileCabinet(fileCabinet);
        const dialogId = await Self.getDialog(fileCabinet, action, fileCabinetId);

        // get delivery note
        const deliveryNote = await models.Ticket.deliveryNotePdf(ctx, {
            id,
            type: 'deliveryNote'
        });

        // get ticket data
        const ticket = await models.Ticket.findById(id, {
            include: [{
                relation: 'client',
                scope: {
                    fields: ['id', 'socialName', 'fi']
                }
            }]
        });

        // upload file
        const templateJson = {
            'Fields': [
                {
                    'FieldName': 'N__ALBAR_N',
                    'ItemElementName': 'string',
                    'Item': id,
                },
                {
                    'FieldName': 'CIF_PROVEEDOR',
                    'ItemElementName': 'string',
                    'Item': ticket.client().fi,
                },
                {
                    'FieldName': 'CODIGO_PROVEEDOR',
                    'ItemElementName': 'string',
                    'Item': ticket.client().id,
                },
                {
                    'FieldName': 'NOMBRE_PROVEEDOR',
                    'ItemElementName': 'string',
                    'Item': ticket.client().socialName,
                },
                {
                    'FieldName': 'FECHA_FACTURA',
                    'ItemElementName': 'date',
                    'Item': ticket.shipped,
                },
                {
                    'FieldName': 'TOTAL_FACTURA',
                    'ItemElementName': 'Decimal',
                    'Item': ticket.totalWithVat,
                },
                {
                    'FieldName': 'ESTADO',
                    'ItemElementName': 'string',
                    'Item': 'Pendiente procesar',
                },
                {
                    'FieldName': 'FIRMA_',
                    'ItemElementName': 'string',
                    'Item': 'Si',
                },
                {
                    'FieldName': 'FILTRO_TABLET',
                    'ItemElementName': 'string',
                    'Item': 'Tablet1',
                }
            ]
        };

        if (process.env.NODE_ENV != 'production')
            throw new UserError('Action not allowed on the test environment');

        // delete old
        const docuwareFile = await models.Docuware.checkFile(ctx, id, fileCabinet, false);
        if (docuwareFile) {
            const deleteJson = {
                'Field': [{'FieldName': 'ESTADO', 'Item': 'Pendiente eliminar', 'ItemElementName': 'String'}]
            };
            const deleteUri = `${options.url}/FileCabinets/${fileCabinetId}/Documents/${docuwareFile.id}/Fields`;
            await axios.put(deleteUri, deleteJson, options.headers);
        }

        const uploadUri = `${options.url}/FileCabinets/${fileCabinetId}/Documents?StoreDialogId=${dialogId}`;
        const FormData = require('form-data');
        const data = new FormData();

        data.append('document', JSON.stringify(templateJson), 'schema.json');
        data.append('file[]', deliveryNote[0], 'file.pdf');
        const uploadOptions = {
            headers: {
                'Content-Type': 'multipart/form-data',
                'X-File-ModifiedDate': Date.vnNew(),
                'Cookie': options.headers.headers.Cookie,
                ...data.getHeaders()
            },
        };

        return await axios.post(uploadUri, data, uploadOptions)
            .catch(() => {
                throw new UserError('Failed to upload file');
            });
    };
};