const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
    Self.remoteMethod('clone', {
        description: 'Clones the selected routes',
        accessType: 'WRITE',
        accepts: [
            {
                arg: 'ids',
                type: ['number'],
                required: true,
                description: 'The routes ids to clone'
            },
            {
                arg: 'etd',
                type: 'date',
                required: true,
                description: 'The estimated time of departure for all roadmaps'
            }
        ],
        returns: {
            type: ['Object'],
            root: true
        },
        http: {
            path: `/clone`,
            verb: 'POST'
        }
    });

    Self.clone = async(ids, etd) => {
        const tx = await Self.beginTransaction({});
        try {
            const models = Self.app.models;
            const options = {transaction: tx};
            const originalRoadmaps = await models.Roadmap.find({
                where: {id: {inq: ids}},
                fields: [
                    'id',
                    'name',
                    'supplierFk',
                    'etd'],
                include: [{
                    relation: 'roadmapStop',
                    scope: {
                        fields: ['roadmapFk', 'addressFk', 'eta', 'description']
                    }
                }]

            }, options);

            if (ids.length != originalRoadmaps.length)
                throw new UserError(`The amount of roadmaps found don't match`);

            for (const roadmap of originalRoadmaps) {
                roadmap.id = undefined;
                roadmap.etd = etd;

                const clone = await models.Roadmap.create(roadmap, options);

                const roadmapStops = roadmap.roadmapStop();
                roadmapStops.map(roadmapStop => {
                    roadmapStop.roadmapFk = clone.id;
                    return roadmapStop;
                });
                await models.RoadmapStop.create(roadmapStops, options);
            }

            await tx.commit();

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