const fs = require('fs');
const ejs = require('ejs');

module.exports = Self => {
    Self.remoteMethod('renderer', {
        description: 'Renders the data from an XML',
        accessType: 'READ',
        accepts: [{
            arg: 'expeditionFk',
            type: 'number',
            required: true
        }],
        returns: {
            type: ['object'],
            root: true
        },
        http: {
            path: `/renderer`,
            verb: 'GET'
        }
    });

    Self.renderer = async (expeditionFk) => {
        const models = Self.app.models;

        const viaexpressConfig = await models.ViaexpressConfig.findOne({
            fields: ['client', 'user', 'password', 'defaultWeight', 'deliveryType', 'agencyModeFk']
        });

        const expedition = await models.Expedition.findOne({
            fields: ['id', 'ticketFk'],
            where: {id: expeditionFk},
            include: [
                {
                    relation: 'ticket',
                    scope: {
                        fields: ['shipped', 'addressFk', 'clientFk', 'companyFk', 'agencyModeFk'],
                        include: [
                            {
                                relation: 'client',
                                scope: {
                                    fields: ['mobile', 'phone', 'email']
                                }
                            },
                            {
                                relation: 'address',
                                scope: {
                                    fields: [
                                        'nickname',
                                        'street',
                                        'postalCode',
                                        'city',
                                        'mobile',
                                        'phone',
                                        'provinceFk'
                                    ],
                                    include: {
                                        relation: 'province',
                                        scope: {
                                            fields: ['name', 'countryFk'],
                                            include: {
                                                relation: 'country',
                                                scope: {
                                                    fields: ['code'],
                                                }
                                            }

                                        }
                                    }
                                }
                            },
                            {
                                relation: 'company',
                                scope: {
                                    fields: ['clientFk'],
                                    include: {
                                        relation: 'client',
                                        scope: {
                                            fields: ['socialName', 'mobile', 'phone', 'email', 'defaultAddressFk'],
                                            include: {
                                                relation: 'defaultAddress',
                                                scope: {
                                                    fields: [
                                                        'street',
                                                        'postalCode',
                                                        'city',
                                                        'mobile',
                                                        'phone',
                                                        'provinceFk'
                                                    ],
                                                    include: {
                                                        relation: 'province',
                                                        scope: {
                                                            fields: ['name']
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        });

        const ticket = expedition.ticket();
        const sender = ticket.company().client();
        const shipped = ticket.shipped.toISOString();
        const isInterdia = (ticket.agencyModeFk === viaexpressConfig.agencyModeFk)
        const data = {
            viaexpressConfig,
            sender,
            senderAddress: sender.defaultAddress(),
            client: ticket.client(),
            address: ticket.address(),
            shipped,
            isInterdia
        };

        const template = fs.readFileSync(__dirname + '/template.ejs', 'utf-8');
        const renderedXml = ejs.render(template, data);
        return renderedXml;
    };
};