'use strict';
/**
 *
 *
 * @author Zhong
 * @date 2019/6/5
 * @version
 */
//导出接口相关
const ExportView = (() => {
    let _base = XML_EXPORT_BASE,
        _cache = _base.CACHE,
        _util = _base.UTIL;
    // 导出数据缓存
    let _exportCache = [];
    //设置工程编号表格数据设置
    const sheetSetting = {
        header: [
            {headerName: '名称', headerWidth: 200, dataCode: 'name', dataType: 'String'},
            {headerName: '工程编号', headerWidth: 200, dataCode: 'code', dataType: 'String'},
        ],
        view: {
            lockColumns: ['name'],
            lockRows: [0]
        }
    };
    //操作状态
    const STATE = {
        checking: false,    //自检
        exporting: false,   //导出
        confirming: false   //导出确认
    };
    let spread = null;
    //初始化设置工程编号表格
    function initSpread(datas) {
        if (spread) {
            return;
        }
        spread = SheetDataHelper.createNewSpread($("#exportSpread")[0], 1);
        sheetCommonObj.spreadDefaultStyle(spread);
        let sheet = spread.getSheet(0);
        sheetCommonObj.initSheet(sheet, sheetSetting, 30);
        sheet.setRowCount(datas.length);
        sheetCommonObj.showTreeData(sheet, sheetSetting, datas);
    }
    //获取设置的工程编号
    function getCodeFromSheet(sheet) {
        let codeCol = 1;
        let rst = [];
        //排除建设项目行
        for (let row = 1; row < sheet.getRowCount(); row++) {
            rst.push(sheet.getText(row, codeCol) || '');
        }
        return rst;
    }
    // 回到初始状态,需要清空cache中的数据
    function resetState() {
        _exportCache = [];
        _cache.clear();
    }
    //事件监听
    function exportListener() {
        //导出接口-项目自检
        $('#export-check').click(async function () {
            let failList = _cache.getItem('failList');
            let checkedDatas = $('#export input[type="checkbox"]:checked');
            if (!checkedDatas.length) {
                return;
            }
            if (STATE.checking) {
                return;
            }
            STATE.checking = true;
            let pr = new SCComponent.InitProgressBar();
            try {
                if (!_exportCache || !_exportCache.length) {
                    pr.start('导出数据接口', '正在自检,请稍候……');
                    for (let checkedData of checkedDatas) {
                        let fileKind = parseInt($(checkedData).val());
                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
                                fileKind, projectObj.project.ID(), userID);
                        _exportCache.push(...exportData);
                    }
                }
                failList = _util.deWeightHints(failList);
                //设置提示弹窗
                if (failList.length * 20 > 400) {
                    $('#hintBox_caption').addClass('export-check');
                }
                if (failList.length) {
                    throw failList.join('
');
                } else {
                    throw '自检完成,未检测到错误数据。'
                }
            } catch (err) {
                alert(err);
            }
            pr.end();
            setTimeout(() => {
                STATE.checking = false;
            }, 300);
        });
        //导出接口,如果没有错误,弹出工程编号设置窗口
        $('#export-confirm').click(async function () {
            let failList = _cache.getItem('failList');
            let checkedDatas = $('#export input[type="checkbox"]:checked');
            if (!checkedDatas.length) {
                return;
            }
            if (STATE.exporting) {
                return;
            }
            STATE.exporting = true;
            let pr = new SCComponent.InitProgressBar();
            try {
                let isPring = false;    //是否调用了进度条(控制工程窗口什么时候显示,优化交互)
                if (!_exportCache || !_exportCache.length) {
                    isPring = true;
                    pr.start('导出数据接口', '正在导出文件,请稍候……');
                    for (let checkedData of checkedDatas) {
                        let fileKind = parseInt($(checkedData).val());
                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
                            fileKind, projectObj.project.ID(), userID);
                        _exportCache.push(...exportData);
                    }
                    pr.end();
                }
                failList = _util.deWeightHints(failList);
                //错误-设置提示弹窗
                if (failList.length * 20 > 400) {
                    $('#hintBox_caption').addClass('export-check');
                }
                if (failList.length) {
                    throw failList.join('
');
                }
                //弹出工程编号设置窗口
                if (isPring) {
                    setTimeout(() => {
                        $('#exportCode').modal('show');
                    }, 300);
                } else {
                    $('#exportCode').modal('show');
                }
            } catch (err) {
                console.log(err);
                pr.end();
                alert(err);
            }
            setTimeout(() => {
                STATE.exporting = false;
            }, 300);
        });
        //工程编号设置窗口-----
        //设置工程编号
        $('#exportCode').on('shown.bs.modal', function () {
            if (!_exportCache || !_exportCache.length) {
                alert('数据错误!');
                $(this).modal('hide');
                return false;
            }
            let projectData = _cache.getItem('projectData');
            initSpread(XML_EXPORT_BASE.UTIL.getCodeSheetData(projectData));
        });
        //设置完工程编号后,导出数据。如果选中多个文件,导出压缩包
        $('#exportCode-confirm').click(async function () {
            if (!spread || !_exportCache || !_exportCache.length) {
                return false;
            }
            if (STATE.confirming) {
                return;
            }
            STATE.confirming = true;
            let pr = new SCComponent.InitProgressBar();
            try {
                // 工程编号
                let codes = getCodeFromSheet(spread.getSheet(0));
                if (codes.includes('')) {
                    alert('单项、单位工程工程编号不可为空。');
                    STATE.confirming = false;
                    return false;
                }
                if ([...new Set(codes)].length !== codes.length) {
                    alert('单项、单位工程工程编号必须唯一。');
                    STATE.confirming = false;
                    return false;
                }
                pr.start('导出数据接口', '正在导出文件,请稍候……');
                // 导出文件
                await _base.exportFile(codes, _exportCache, XMLStandard.resetContentCode, XMLStandard.saveAsFile);
            } catch (err) {
                console.log(err);
                alert(err);
            }
            pr.end();
            $('#exportCode').modal('hide');
            $('#export').modal('hide');
            setTimeout(() => {
                STATE.confirming = false;
            }, 300);
        });
        //导出窗口--------
        $('#export').on('hide.bs.modal', function() {
            resetState();
            STATE.checking = false;
            STATE.exporting = false;
            STATE.confirming = false;
            //恢复设置提示弹窗 因为是共用的alert
            $('#hintBox_caption').removeClass('export-check');
            $('#export input[type="checkbox"]:eq(0)').prop('checked', true);
            if (spread) {
                spread.destroy();
                spread = null;
            }
        });
        $('#export input[type="checkbox"]').click(function () {
            resetState();
        });
    }
    return {exportListener}
})();