module.exports = Self => {
    Self.remoteMethodCtx('getLeaves', {
        description: 'Returns the nodes for a department',
        accepts: [{
            arg: 'parentId',
            type: 'Number',
            description: 'Get the children of the specified father',
        }, {
            arg: 'search',
            type: 'String',
            description: 'Filter nodes whose name starts with',
        }],
        returns: {
            type: ['object'],
            root: true
        },
        http: {
            path: `/getLeaves`,
            verb: 'GET'
        }
    });

    Self.getLeaves = async(ctx, parentId = null, search) => {
        let [res] = await Self.rawSql(
            `CALL department_getLeaves(?, ?)`,
            [parentId, search],
            {userId: ctx.req.accessToken.userId}
        );

        let map = new Map();
        for (let node of res) {
            if (!map.has(node.parentFk))
                map.set(node.parentFk, []);
            map.get(node.parentFk).push(node);
        }
        function setLeaves(nodes) {
            if (!nodes) return;
            for (let node of nodes) {
                node.childs = map.get(node.id);
                setLeaves(node.childs);
            }
        }

        let leaves = map.get(parentId);

        setLeaves(leaves);

        return leaves || [];
    };
};