/**
 * Created by Tony on 2017/3/13.
 */

let JV = require('../rpt_component/jpc_value_define');
let Template = require('../models/rpt_template');
let TemplateData = require('../models/rpt_tpl_data_demo');
let JpcEx = require('../rpt_component/jpc_ex');
//let cache = require('../../../public/cache/cacheUtil');
let rptUtil = require("../util/rpt_util");
let rpt_xl_util = require('../util/rpt_excel_util');
let fs = require('fs');
let strUtil = require('../../../public/stringUtil');

//统一回调函数
let callback = function(req, res, err, data){
    if(err){
        res.json({success: false, error: err});
    }
    else{
        //res.send({success: true, data: data});
        res.json({success:true, data: data});
    }
};

function getAllPagesCommon(req, res, rpt_id, pageSize, cb) {
    let rptTpl = null;
    Template.findOne({ID: rpt_id}, '-_id').exec().then(function(rst) {
        rptTpl = rst;
        if (rptTpl) {
            if (rptTpl.ID_KEY) {
                return TemplateData.getPromise(rptTpl.ID_KEY);
            } else {
                callback(req, res, 'No report template data were found!', null);
            }
        } else {
            callback(req, res, 'No report template was found!', null);
        }
    }).then(function(tplData){
            if (tplData) {
                let printCom = JpcEx.createNew();
                rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                let defProperties = rptUtil.getReportDefaultCache();
                printCom.initialize(rptTpl);
                printCom.analyzeData(rptTpl, tplData, defProperties);
                let maxPages = printCom.totalPages;
                let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                if (pageRst) {
                    cb(pageRst);
                } else {
                    callback(req, res, "Have errors while on going...", null);
                }
            } else {
                callback(req, res, 'No report data were found!', null);
            }
        }
    );
};

module.exports = {
    getReportAllPages: function(req, res){
        let rpt_id = req.body.ID;
        let pageSize = req.body.pageSize;
        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
            callback(req, res, null, pageRst);
        })
    },
    getExcel: function(req, res) {
        let rpt_id = req.params.id,
            pageSize = req.params.size,
            rptName = req.params.rptName;
        getAllPagesCommon(req, res, rpt_id, pageSize, function(pageRst){
            rpt_xl_util.exportExcel(pageRst, rptName, null, function(newName){
                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
                filestream.on('data', function(chunk) {
                    res.write(chunk);
                });
                filestream.on('end', function() {
                    res.end();
                });
            });
        })
    }
};
