analysisModule.directive('tableReportSheet', ['$rootScope', '$log', '$timeout', '$q', 'templateService', 'enums', 'keyValueDataService', 'spreadJsTipService',
    '$interval', 'vatSessionService',
    function ($rootScope, $log, $timeout, $q, templateService, enums, keyValueDataService, spreadJsTipService, $interval, vatSessionService) {
        'use strict';
        $log.debug('tableReportSheet.ctor()...');

        return {
            restrict: 'E',
            template: '<div class="report" style="height: 100%;width: 100%;"></div>',
            replace: true,
            scope: {
                templateId: '=',
                spread: '=',
                reportSource: '=',
                formulaBlocks: '=',
                manualDataSources: '=',
                isReadOnly: '=',
                serviceType: '=',
                initRow: '=?',
                initCol: '=?',
                reportApi: '=?', // In: onCellClick, onCellDoubleClick; Out: refreshReport,
                relation: '='
            },
            link: function (scope, element) {
                $log.debug('vatReportSheet.link()...');

                // Register api functions in internalApi
                // If selectorApi passed is not undefined, we will use it as internalApi
                scope.internalApi = scope.reportApi || {};

                scope.projectYear = vatSessionService.year;
                scope.projectPeriod = scope.serviceType === enums.serviceType.VAT ? vatSessionService.month : 0;

                var profileList = ["EBIT考虑资产减值损失", "加:特殊因素考虑", "EBIT(考虑特殊因素)", "EBIT rate", "关联交易金额", "6%增值税", "价税合计金额"];
                // 首次进入页面时,通过promise模式保证在加载完成后再调用locateCell以focus在特定单元格
                // 如果是在当前页面要focus在特定单元格,通过watch行列号来完成
                /*      scope.$watchGroup(['initRow', 'initCol'], function (newVal, oldVal) {
                          if (_.isNumber(scope.initRow) && _.isNumber(scope.initCol)) {
                              var spreadCtrl = getSpreadControl();
                              if (spreadCtrl) {
                                  locateCell(spreadCtrl);
                              }
                              spreadCtrl = null;
                          }
                      });*/

                /*  var locateCell = function (spread, forceCloseModal) {
                      if (_.isNumber(scope.initRow) && _.isNumber(scope.initCol)) {
                          var sheet;
                          if (constant.regesterInformation.active) {
                              sheet = spread.getActiveSheet();
                          }
                          else {
                              sheet = spread.getSheet(1);
                          }

                          //var sheet = spread.getActiveSheet();
                          //var sheet = spread.getSheet(1);

                          sheet.setSelection(scope.initRow, scope.initCol, 1, 1);
                          if (_.isFunction(scope.internalApi.onCellClick) && !forceCloseModal) {
                              scope.internalApi.onCellClick({
                                  'args': {row: scope.initRow, col: scope.initCol},
                                  'data': JSON.parse(sheet.getTag(scope.initRow, scope.initCol))
                              });
                          }

                          $log.debug(sheet.getTag(scope.initRow, scope.initCol));

                          scope.initRow = null;
                          scope.initCol = null;
                          sheet = null;
                          return $q.when();
                      }
                  };*/

               /* scope.$watchGroup(['relation.period', 'relation.orgId', 'relation.data'], function (newValue, oldValue) {
                    if (scope.relation.orgId != null && scope.relation.period != null) {
                      /!*  setTimeout(function () {
                            if ((scope.relation.broadcast && scope.relation.broadcast == true) || scope.spread != undefined) {
                                loadSheet(scope.templateId, false)
                            } else {
                                loadSheet(scope.templateId, true);
                            }
                        }, 200);*!/
                        loadSheet(scope.templateId);
                    }
                });
                scope.$watch('relation.broadcast', function (newValue, oldValue) {
                    if (scope.relation.orgId != null && scope.relation.period != null) {
                       // loadSheet(scope.templateId, false)
                        loadSheet(scope.templateId)
                    }
                });*/



                var loadSheet = function (templateId ) {
                    //var prokjectId = vatSessionService.project.id;
                    //var period = vatSessionService.month;
                  /*  if (!init) {
                        scope.relation.addEbitRow();
                        setData(init)
                        return;
                    }*/
                    if(scope.relation.orgId == undefined){
                        scope.relation.orgId = null;
                    }
                    if(templateId == undefined )
                        return;
                    return templateService.getPeriodTemplateJsonByOrg(templateId, scope.relation.period, scope.relation.orgId).then(function (reportSpread) {
                        var spreadCtrl = getSpreadControl();
                        if (spreadCtrl) {
                            spreadCtrl.destroy();
                        }
                        spreadCtrl = null;
                        if (!_.isEmpty(reportSpread)) {
                            initSpreadExcel(reportSpread).then(function (spread) {
                                /*  return locateCell(spread, true);*/
                            });
                        }
                    }, function (data) {
                        $log.info(data);
                    });
                };

                //初始化spread
               /* var _init = function(){
                    return templateService.getPeriodTemplateJsonByOrg(templateId, scope.relation.period, scope.relation.orgId).then(function (reportSpread) {
                        if (!_.isEmpty(reportSpread)) {
                            var spreadCtrl = getSpreadControl();
                            if (spreadCtrl) {
                                spreadCtrl.destroy();
                            }
                            spreadCtrl = null;
                            initSpreadExcel(reportSpread, true).then(function (spread) {
                                /!*  return locateCell(spread, true);*!/
                            });
                        }
                    }, function (data) {
                        $log.info(data);
                    });
                }*/

               var setColWidth = function(sheet){
                   for(var i  = 0; i < sheet.getColumnCount(); i++){
                        if(i ==0){
                            sheet.setColumnWidth(0, 360)
                            continue
                        }
                       sheet.setColumnWidth(i, 180);
                   }
               }

               //创建自定义格式
                function CustomPerFormat() {

                }
                CustomPerFormat.prototype = new GC.Spread.Formatter.FormatterBase();
                CustomPerFormat.prototype.format = function (obj, formattedData) {
                    return perFormat(obj, formattedData);
                }
                function perFormat(value, formattedData){
                    value = value.toString();
                    if(0 <= value <= 100){
                           if( value.indexOf("%") != -1){
                               value += "%";
                           }
                    }else{
                        formattedData.conditionalForeColor = "red";
                    }
                    return value;
                }
                var initSpreadExcel = function (reportSpread) {

                    var spread = getSpreadControl();

                    spread.suspendPaint();
                    spread.fromJSON(reportSpread);
                    spread.options.showVerticalScrollbar = true;
                    spread.options.showHorizontalScrollbar = true;
                    spread.options.scrollbarMaxAlign = true;
                    spread.options.scrollbarShowMax = true;
                    spread.options.tabNavigationVisible = true;
                    if (constant.regesterInformation.active) {
                        spread.options.tabEditable = false;
                        spread.options.tabStripVisible = false;
                        spread.options.newTabVisible = false;
                    }
                    spread.options.allowUndo = false;
                    spread.options.allowUserResize = false;
                    spread.options.allowUserDragDrop = false;
                    spread.options.allowUserDragFill = false;
                    spread.options.allowUserEditFormula = false;
                    spread.options.allowContextMenu = false;
                    initInterFunction(spread);
                    //todo:注册之后这里去掉注释
                    //var sheet = spread.getActiveSheet();

                    var sheet;
                    if (constant.regesterInformation.active) {
                        sheet = spread.getActiveSheet();
                    }
                    else {
                        sheet = spread.getSheet(1);
                    }
                    if (sheet != null) {
                        sheet.options.rowHeaderVisible = true;
                        sheet.options.colHeaderVisible = true;
                        sheet.options.gridline.showVerticalGridline = true;
                        sheet.options.gridline.showHorizontalGridline = true;
                        sheet.options.isProtected = true;
                        sheet.clearSelection();
                    }
                    scope.spread = spread;
                    scope.relation.sheet = spread.getActiveSheet();
                    setColWidth(sheet);
                    if(sheet.getRowCount() <= 38)
                        scope.relation.addEbitRow(sheet)
                    if (scope.templateId && scope.reportSource) {
                        setData();
                    }
                    sheet.setRowResizable(0,false,GC.Spread.Sheets.SheetArea.viewport);
                    spread.resumePaint();
                    return $q.when(spread);
                };

                    scope.relation.addEbitRow = function (sheet) {
                    if (sheet == undefined || sheet == null)
                        sheet = scope.spread.getActiveSheet();
                    //添加单元格
                    if (sheet.getRowCount() > 43)
                        return;
                    sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1);
                    sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1);
                    sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1);
                    for (var i = 0; i <= 7; i++) {
                        sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1);
                        sheet.setValue(i + 37, 0, profileList[i]);
                    }
                    scope.relation.lockCell(scope.spread);
                }

                    scope.relation.lockCell = function (spread) {
                    //todo:注册之后这里去掉注释
                    var sheet;
                    if (constant.regesterInformation.active) {
                        sheet = spread.getActiveSheet();
                    }
                    else {
                        sheet = spread.getSheet(1);
                    }
                    for (var i = 0; i <= 36; i++) {
                        for (var j = 0; j <= 5; j++) {
                            sheet.getCell(i, j).locked(true);
                        }
                    }
                    ///解锁指定单元格
                    sheet.getCell(38, 2).locked(false);//特殊因素
                    sheet.getCell(40, 2).locked(false);//ebit比率
                    //
                    sheet.setFormatter( 38, 2,"0.00");
                    sheet.setFormatter( 40, 2,"0.00%");
                        //sheet.setFormatter(40, 2, new CustomPerFormat());
                        //sheet.getCell(40, 2).formatter(new CustomPerFormat());
                };

                // 每个单元格大致由以下部分构成:_SumAll(_Inter(...)+_Manual(...)+C1)
                // _Inter: IronPython公式计算结果
                // _Manual: 手工数据源值
                // C1: 类似的Excel公式,通过SpreadJS公式引擎计算
                var initInterFunction = function (spread) {
                    var activeSheet;
                    if (constant.regesterInformation.active) {
                        activeSheet = spread.getActiveSheet();
                    }
                    else {
                        activeSheet = spread.getSheet(1);
                    }
                    var manualFunc = function () {
                    };
                    manualFunc.prototype = new GC.Spread.CalcEngine.Functions.Function("_Manual", 1, 1);
                    manualFunc.prototype.evaluate = function (args) {
                        if (!_.isString(args)) {
                            return "#VALUE!";
                        }

                        //var cellTemplateID = Number(args);
                        var ds = _.where(scope.manualDataSources, {item1: args});
                        if (!_.isEmpty(ds)) {
                            return _.reduce(ds, function (memo, x) {
                                if (x.item2.dataSourceType === 6) {
                                    var rtn = x.item2.amount;
                                    rtn = PWC.tryParseStringToNum(rtn);

                                    // 如果是数值数据源,只有OperationType为2时,该数据源的数值应被减去;其他情况下应被加上
                                    if (_.isNumber(rtn) && !isNaN(rtn)) {
                                        var operationType = x.item2.operationType;
                                        rtn = operationType === 2 ? (-rtn) : rtn;
                                    }

                                    return memo + rtn;
                                }
                                else {
                                    return memo;
                                }
                            }, 0);
                        }
                        return 0;
                    };

                    spread.clearCustomFunctions();
                    activeSheet.addCustomFunction(new manualFunc());
                };


                // Get spreadJS control.
                var getSpreadControl = function () {
                    scope.relation.sheetArea = GC.Spread.Sheets.SheetArea;
                    return new GC.Spread.Sheets.Workbook(getSpreadControlElement());
                };

                // Get spreadJS control element
                var getSpreadControlElement = function () {
                    //var elem = document.getElementsByClassName('report-view');
                    var elem = document.getElementById('r_' + scope.templateId);
                    if (!elem) {
                        var elems = document.getElementsByClassName('report');
                        if (!elems || elems.length === 0) {
                            return undefined;
                        }
                        return elems[0];
                    }
                    return elem;
                };


                // 根据已有信息通过spreadJS计算各单元格的值
                var setData = function (upload) {
                    var sheet = scope.spread.sheets[0];
                  /*  if (!init && scope.relation.broadcast == true) {
                        scope.relation.loadEbitCell(sheet);
                        return;
                    }*/
                    if(upload){ //上传上来的文件也要动态添加行
                        scope.relation.addEbitRow(sheet);
                        scope.relation.loadEbitCell(sheet);
                        scope.relation.lockCell(scope.spread);
                        setColWidth(sheet);
                        scope.spread.resumePaint();
                        return
                    }else{
                        scope.relation.loadEbitCell(sheet);
                    }
                    if (angular.isArray(scope.reportSource)) {

                        //spreadJsTipService.initialize(sheet);

                        /*if (!scope.isReadOnly) {
                            scope.relation.lockCell(scope.spread, false, true);
                        }*/

                        scope.spread.suspendPaint();
                      /*  if (scope.reportSource.length == 0 && scope.relation.emptyData && scope.relation.emptyData == true) {
                            _init(scope.templateId, true);///如果没有数据,需要重新加载
                            scope.relation.lockCell(scope.spread);
                            return;
                        }
*/
                        scope.reportSource.forEach(function (data) {
                            //fix bug11737 导出需要显示千分位
                            // 避免直接使用data.value = parseFloat(data.value)导致非数字型value无法显示
                            data.value = PWC.tryParseStringToNum(data.value);
                            //var cell = sheet.getCell(data.rowIndex, data.columnIndex);
                            if (_.isNumber(data.value) && !isNaN(data.value)) {
                                data.value = data.value.toFixed(4);
                            }
                            sheet.setValue(data.rowIndex, data.columnIndex, data.value); // 只有数值,设置为数值
                        });
                        // 设置破折号单元格的值和显示格式,将其替换为带破折号格式的0值,这样引用到的其他单元格才能正常计算
                        var rowCount = sheet.getRowCount();
                        var columnCount = sheet.getColumnCount();
                        for (var r = 0; r < rowCount; r++) {
                            for (var c = 0; c < columnCount; c++) {
                                var cell = sheet.getCell(r, c);
                                if (cell.value() === '——') {
                                    cell.value(0);
                                    cell.formatter("[=0]——;0.00");
                                }
                            }
                        }
                        scope.relation.lockCell(scope.spread);
                        scope.spread.resumePaint();
                        scope.relation.saveToDbFlag = Math.random();

                    }
                };
                scope.relation.setData = setData;//绑定单元格数据设置
                scope.relation.loadSheet = loadSheet;//绑定单元格加载

                (function initialize() {
                    loadSheet(scope.templateId);
                })();

            }
        };
    }
]);