module.exports = Self => {
    Self.remoteMethodCtx('newCollection', {
        description: 'Make a new collection of tickets',
        accessType: 'WRITE',
        accepts: [{
            arg: 'collectionFk',
            type: 'Number',
            required: false,
            description: 'The collection id'
        }, {
            arg: 'sectorFk',
            type: 'Number',
            required: true,
            description: 'The sector of worker'
        }, {
            arg: 'vWagons',
            type: 'Number',
            required: true,
            description: 'The number of wagons'
        }],
        returns: {
            type: 'Object',
            root: true
        },
        http: {
            path: `/newCollection`,
            verb: 'POST'
        }
    });

    Self.newCollection = async(ctx, collectionFk, sectorFk, vWagons) => {
        let query = '';

        if (!collectionFk) {
            const userId = ctx.req.accessToken.userId;
            query = `CALL vn.collectionTrain_newBeta(?,?,?)`;
            const [result] = await Self.rawSql(query, [sectorFk, vWagons, userId]);
            if (result.length == 0)
                throw new Error(`No collections for today`);

            collectionFk = result[0].vCollectionFk;
        }

        query = `CALL vn.collectionTicket_get(?)`;
        const [tickets] = await Self.rawSql(query, [collectionFk]);

        query = `CALL vn.collectionSale_get(?)`;
        const [sales] = await Self.rawSql(query, [collectionFk]);

        query = `CALL vn.collectionPlacement_get(?)`;
        const [placements] = await Self.rawSql(query, [collectionFk]);

        query = `CALL vn.collectionSticker_print(?,?)`;
        await Self.rawSql(query, [collectionFk, sectorFk]);

        return makeCollection(tickets, sales, placements, collectionFk);
    };

    /**
     * Returns a collection json
     * @param {*} tickets - Request tickets
     * @param {*} sales - Request sales
     * @param {*} placements - Request placements
     * @param {*} collectionFk - Request placements
     * @return {Object} Collection JSON
     */
    async function makeCollection(tickets, sales, placements, collectionFk) {
        let collection = [];

        for (let i = 0; i < tickets.length; i++) {
            let ticket = {};
            ticket['ticketFk'] = tickets[i]['ticketFk'];
            ticket['level'] = tickets[i]['level'];
            ticket['agencyName'] = tickets[i]['agencyName'];
            ticket['warehouseFk'] = tickets[i]['warehouseFk'];
            ticket['salesPersonFk'] = tickets[i]['salesPersonFk'];

            let ticketSales = [];

            for (let x = 0; x < sales.length; x++) {
                if (sales[x]['ticketFk'] == ticket['ticketFk']) {
                    let sale = {};
                    sale['collectionFk'] = collectionFk;
                    sale['ticketFk'] = sales[x]['ticketFk'];
                    sale['saleFk'] = sales[x]['saleFk'];
                    sale['itemFk'] = sales[x]['itemFk'];
                    sale['quantity'] = sales[x]['quantity'];
                    if (sales[x]['quantityPicked'] != null)
                        sale['quantityPicked'] = sales[x]['quantityPicked'];
                    else
                        sale['quantityPicked'] = 0;
                    sale['longName'] = sales[x]['longName'];
                    sale['size'] = sales[x]['size'];
                    sale['color'] = sales[x]['color'];
                    sale['discount'] = sales[x]['discount'];
                    sale['price'] = sales[x]['price'];
                    sale['stems'] = sales[x]['stems'];
                    sale['category'] = sales[x]['category'];
                    sale['origin'] = sales[x]['origin'];
                    sale['clientFk'] = sales[x]['clientFk'];
                    sale['productor'] = sales[x]['productor'];
                    sale['reserved'] = sales[x]['reserved'];
                    sale['isPreviousPrepared'] = sales[x]['isPreviousPrepared'];
                    sale['isPrepared'] = sales[x]['isPrepared'];
                    sale['isControlled'] = sales[x]['isControlled'];

                    let salePlacements = [];

                    for (let z = 0; z < placements.length; z++) {
                        if (placements[z]['saleFk'] == sale['saleFk']) {
                            let placement = {};
                            placement['saleFk'] = placements[z]['saleFk'];
                            placement['itemFk'] = placements[z]['itemFk'];
                            placement['placement'] = placements[z]['placement'];
                            placement['shelving'] = placements[z]['shelving'];
                            placement['created'] = placements[z]['created'];
                            placement['visible'] = placements[z]['visible'];
                            placement['order'] = placements[z]['order'];
                            placement['grouping'] = placements[z]['grouping'];
                            salePlacements.push(placement);
                        }
                    }
                    sale['placements'] = salePlacements;
                    ticketSales.push(sale);
                }
            }
            ticket['sales'] = ticketSales;
            collection.push(ticket);
        }

        return collection;
    }
};