module.exports = function addMissing(rqf){
    return (req, res, next) => {
        let dims = Object.keys(req.dims).filter(i => {return i !== 'size';});
        // FIXME: No momento, só funciona para duas dimensões (padrão para o LDE)
        if(dims.length != 2) return next();
        if(req.filter.min_year != req.filter.max_year) return next();
        if(req.result.length === 0) return next();
    
        let result = req.result;
        let dimsValues = {};
        result.forEach((r) => {
            dims.forEach((dim) => {
                let rqfName = rqf.fieldValues[dim].resultField;
                if(typeof dimsValues[rqfName] === 'undefined') {
                    dimsValues[rqfName] = [];
                }
                if(dimsValues[rqfName].indexOf(r[rqfName]) === -1) {
                    dimsValues[rqfName].push(r[rqfName]);
                }
            })
        });
    
        let G = {};
        let rqfName = rqf.fieldValues[dims[0]].resultField;
        let rqfName2 = rqf.fieldValues[dims[1]].resultField;
        G[rqfName] = {};
        dimsValues[rqfName].forEach((value) => {
            let secondDim = {};
            
            dimsValues[rqfName2].forEach((dValue) => {
                secondDim[dValue] = false;
            });
    
            G[rqfName][value] = {};
            G[rqfName][value][rqfName2] = secondDim;
        });
        
        result.forEach((r) => {
            let resultDim1 = r[rqfName];
            let resultDim2 = r[rqfName2];
            
            G[rqfName][resultDim1][rqfName2][resultDim2] = true;
        });
    
        Object.keys(G[rqfName]).forEach((dim1Value) => {
            Object.keys(G[rqfName][dim1Value][rqfName2]).forEach((dim2Value) => {
                let value = G[rqfName][dim1Value][rqfName2][dim2Value];
                if(!value) {
                    let newEntry = Object.assign({}, result[0], {[rqfName]: parseInt(dim1Value, 10), [rqfName2]: parseInt(dim2Value, 10), total: 0});
                    // result.push(newEntry);
                    let index = 0;
                    for(let i = 0; i < result.length; ++i) {
                        let r = result[i];
                        index = i;
                        if(r[rqfName] > newEntry[rqfName]) break;
                        if(r[rqfName] == newEntry[rqfName] && r[rqfName2] > newEntry[rqfName2]) break;
                    }
                    let newResult = [...result.slice(0, index), newEntry, ...result.slice(index, result.length)];
                    result = newResult;
                }
            });
        });
    
        req.result = result;
    
        next();
    };
};