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

import mongoose from "mongoose";
import async from "async";

import JV from "../rpt_component/jpc_value_define";

let Template = mongoose.model('rpt_templates');
// let rptTplDataFacade = require("../facade/rpt_tpl_data_facade");
// let fsUtil = require("../../../public/fsUtil");

import rptTplFacade from "../facade/rpt_template_facade";
import demoTemplateFacade from "../facade/rpt_tpl_data_demo_facade";

import JpcEx from "../rpt_component/jpc_ex";
import rptUtil from "../util/rpt_util";
import rpt_xl_util from "../util/rpt_excel_util";
import rpt_pdf_util from "../util/rpt_pdf_util";
import fs from "fs";
import strUtil from "../../../public/stringUtil";
// import rptDataExtractor from "../util/rpt_construct_data_util";

//统一回调函数
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 getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
    let rptTpl = null;
    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
        rptTpl = rst;
        if (rptTpl) {
            if (rptTpl.ID_KEY) {
                return demoTemplateFacade.getDemoData(rptTpl.ID_KEY);
            } else {
                //callback(req, res, 'No report template data were found!', null);
                cb('No report template data were found!', null);
            }
        } else {
            //callback(req, res, 'No report template was found!', null);
            cb('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();
                let dftOption = option||JV.PAGING_OPTION_NORMAL;
                printCom.initialize(rptTpl);
                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
                let maxPages = printCom.totalPages;
                let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                if (pageRst) {
                    cb(null, pageRst);
                } else {
                    //callback(req, res, "Have errors while on going...", null);
                    cb('Have errors while on going...', null);
                }
            } else {
                //callback(req, res, 'No report data were found!', null);
                cb('No report data were found!', null);
            }
        }
    );
}

function getPreViewPage(rpt_id, pageSize, cb) {
    let rptTpl = null;
    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
        rptTpl = rst;
        if (rptTpl) {
            let printCom = JpcEx.createNew();
            let defProperties = rptUtil.getReportDefaultCache();
            rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
            printCom.initialize(rptTpl);
            let pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
            if (pageRst) {
                //fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/previewPageResult.jsp");
                cb(null, pageRst);
            } else {
                cb('Have errors while on going...', null);
            }
        } else {
            cb('No report template was found!', null);
        }
    });
}

/*
function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, option, cb) {
    let rptTpl = null;
    rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
        rptTpl = rst;
        if (rptTpl) {
            let rptDataUtil = new rptDataExtractor();
            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
            let filter = rptDataUtil.getDataRequestFilter();
            rptTplDataFacade.prepareProjectData(user_id, prj_id, filter, function (err, msg, rawDataObj) {
                if (!err) {
                    let tplData = rptDataUtil.assembleData(rawDataObj);
                    let printCom = JpcEx.createNew();
                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                    let defProperties = rptUtil.getReportDefaultCache();
                    let dftOption = option||JV.PAGING_OPTION_NORMAL;
                    printCom.initialize(rptTpl);
                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
                    let maxPages = printCom.totalPages;
                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                    if (pageRst) {
                        //fsUtil.wirteObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
                        cb(null, pageRst);
                    } else {
                        cb('Have errors while on going...', null);
                    }

                } else {
                    cb('No report data were found!', null);
                }
            });
        } else {
            cb('No report template was found!', null);
        }
    })
}
//*/
module.exports = {
    getPreviewPage: function(req, res) {
        let params = JSON.parse(req.body.params),
            rpt_id = params.rpt_tpl_id,
            pageSize = params.pageSize;
        getPreViewPage(rpt_id, pageSize, function (err, pageRst) {
            callback(req, res, err, pageRst);
        });
    },
    // getReportAllPages: function (req, res) {
    //     let rpt_id = req.body.rpt_tpl_id, prj_id = req.body.prj_id,
    //         user_id = req.body.user_id, pageSize = req.body.pageSize;
    //     getAllPagesCommon(rpt_id, prj_id, user_id, pageSize, function (err, pageRst) {
    //         callback(req, res, err, pageRst);
    //     });
    // },

    getReportAllPages: function (req, res) {
        callback(req, res, 'default none!', null);
    },

    getTestReportAllPages: function(req, res){
        let rpt_id = req.body.ID;
        let pageSize = req.body.pageSize;
        getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
            //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
            callback(req, res, err, pageRst);
        })
    },
    getTestExcel: function(req, res) {
        let rpt_id = req.params.id,
            pageSize = req.params.size,
            rptName = req.params.rptName,
            isOneSheet = req.params.isOneSheet,
            option = req.params.option;
        let dftOption = option||JV.PAGING_OPTION_NORMAL;
        getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
            fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
            try {
                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, 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();
                    });
                });
            } catch (e) {
                console.log(e);
            }
        })
    },
    getTestExcelInOneBook: function(req, res) {
        let rpt_ids = req.params.ids.split(','),
            pageSize = req.params.size,
            rptName = req.params.rptName,
            option = req.params.option;
        let parallelFucs = [];
        let dftOption = option||JV.PAGING_OPTION_NORMAL;
        for (let id of rpt_ids) {
            parallelFucs.push((function (rpt_id) {
                return function (cb) {
                    getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function (err, pageRst) {
                        if(err){
                            cb(err);
                        }
                        else{
                            cb(null, pageRst);
                        }
                    })
                }
            })(parseInt(id)));
        }
        async.parallel(parallelFucs, function (err, pageRstArray) {
            if (err) {
                callback(req, res, '数据有误', null);
            } else {
                rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
                    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/' + tmpFilePath + '.xlsx');
                    filestream.on('data', function(chunk) {
                        res.write(chunk);
                    });
                    filestream.on('end', function() {
                        res.end();
                    });
                });
                //callback(req, res, false, '', {compilation: rst, gljLibs: gljLibsRst});
            }
        })
    },
    getTestPDF:function (req, res) {
        let rpt_id = req.params.id,
            pageSize = req.params.size,
            rptName = req.params.rptName;

        getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");

                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
                filestream.on('data', function(chunk) {
                    res.write(chunk);
                });
                filestream.on('end', function() {
                    res.end();
                });
            })

        })

    }
};
