citModule.controller('citVoucherMappingController', ['$scope', '$log', '$timeout', '$q', '$interval', '$translate', 'loginContext', 'apiInterceptor',
    'Upload', 'dataImportService', 'SweetAlert', 'vatImportService', 'vatSessionService', 'citSessionService', 'uiGridConstants', 'enums', 'vatCommonService',
function ($scope, $log, $timeout, $q, $interval, $translate, loginContext, apiInterceptor, Upload, dataImportService, SweetAlert, vatImportService,
    vatSessionService, citSessionService, uiGridConstants, enums, vatCommonService) {
    'use strict';
    $log.debug('citVoucherMappingController.ctor()...');

    var uploadUrl = apiInterceptor.vatWebApiHostUrl + '/FileUpload/NewFile';
    var successCount = 0;
    var resumable = true;
    var period = citSessionService.month;
    var projectDbName = vatSessionService.project.dbName;
    $scope.chunkSize = 100000;
    $scope.columnNum = 1;

    $scope.showErrorTable = false;
    $scope.showInitTable = false;
    $scope.showImportTable = false
    $scope.period = citSessionService.month;
    
    var validationErrorType = {
        PeriodParseErrorType: $translate.instant('PeriodParseErrorType'),
        ItemIDParseErrorType: $translate.instant('ItemIDParseErrorType'),
        DuplicateInDBErrorType: $translate.instant('DuplicateInDBErrorType'),
        DuplicateInFileErrorType: $translate.instant('DuplicateInFileErrorType'),
        EmptyFieldErrorType: $translate.instant('EmptyFieldErrorType'),
        OverLengthFieldErrorType: $translate.instant('OverLengthFieldErrorType')
    };

    var serverErrorType = {
        DuplicateInDBErrorType: 'DuplicateInDB',
        DuplicateInFileErrorType: 'DuplicateInFile',
        EmptyFieldErrorType: 'EmptyField',
        OverLengthFieldErrorType: 'OverLengthField'
    };

    var initColumns = function () {

        $scope.allColumns = [
            $translate.instant('PleaseSelectColumn'),
            $translate.instant('tranCode'),
            $translate.instant('period'),
            $translate.instant('vGroup'),
            $translate.instant('vid'),
            $translate.instant('itemID')
        ];

        $scope.necessoryColumns = [
            $translate.instant('tranCode'),
            $translate.instant('period'),
            $translate.instant('vGroup'),
            $translate.instant('vid'),
            $translate.instant('itemID')
        ];
    };

    var initGrid = function () {

        $scope.gridOptions = {
            rowHeight: constant.UIGrid.rowHeight,
            selectionRowHeaderWidth: constant.UIGrid.rowHeight,
            enableFullRowSelection: false,
            enableRowSelection: false,
            enableSorting: false,
            enableFiltering: false,
            enableColumnMenus: false,
            enableRowHeaderSelection: false,
            enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
            columnDefs: [
            {
                field: 'index', name: $translate.instant('ImportErrorPopUpNoCol'), width: '10%', headerCellClass: '', enableFiltering: false,

                cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.index}}<span></div>'
            },
              {
                  field: 'tranCode', name: $translate.instant('tranCode'), width: '18%', headerCellClass: '',

                  cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.tranCode}}">{{row.entity.tranCode}}<span></div>'
              },

              {
                  field: 'period', name: $translate.instant('period'), width: '18%', headerCellClass: 'right',

                  cellTemplate: '<div class="ui-grid-cell-contents right"><span title="{{row.entity.period}}">{{row.entity.period}}</span></div>'
              },
              {
                  field: 'group', name: $translate.instant('vGroup'), width: '18%', headerCellClass: '',

                  cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.group}}">{{row.entity.group}}</span></div>'
              },
              {
                  field: 'vid', name: $translate.instant('vid'), width: '18%', headerCellClass: '',

                  cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.vid}}">{{row.entity.vid}}</span></div>'
              },
               {
                   field: 'itemID', name: $translate.instant('itemID'), width: '18%', headerCellClass: '',

                   cellTemplate: '<div class="ui-grid-cell-contents"><span title="{{row.entity.itemID}}">{{row.entity.itemID}}</span></div>'
               }
            ],
            onRegisterApi: function (gridApi) {
                $scope.gridApiTotal = gridApi;
            }
        };

        $scope.gridOptions.noData = false;
    };

    $scope.$on(enums.vatEvent.layoutChanged, function () {
        $scope.gridApiTotal.core.handleWindowResize();
        $scope.errorGridApi.core.handleWindowResize();
    });

    //parentIndex:column index
    //index:selecteditem index
    var mappingColumn = function (parentIndex, index, colName) {
        if (colName) {

            var oldColumn = $scope.selectedColumnMap[parentIndex];
            var newColumn = $scope.allColumns[index];

            if (oldColumn === newColumn) {
                return;
            }
            else {
                $scope.selectedColumnMap[parentIndex] = colName;

                if (colName !== $translate.instant('PleaseSelectColumn')) {
                    $scope.allColumns.splice(index, 1);

                    if (oldColumn && oldColumn !== $translate.instant('PleaseSelectColumn')) {
                        $scope.allColumns.push(oldColumn);
                    }
                }
                else {
                    if (oldColumn) {
                        $scope.allColumns.push(oldColumn);
                    }
                }
            }
        }
        $log.debug($scope.selectedColumnMap);
    };

    var UploadFile = function (file) {
        if (file) {
            if (!file.name.endsWith('.xls') && !file.name.endsWith('.xlsx')) {
                SweetAlert.warning($translate.instant('ImportFileInvalidType'));
                return;
            };
            $scope.initIncomeInvoiceList = [];
            successCount = 0;
            if (!file.$error) {
                var tempFileName = PWC.newGuid() + '.dat';
                Upload.upload({
                    url: uploadUrl,
                    data: {
                        filename: file.name,
                        tempFileName: tempFileName,
                        file: file
                    },
                    resumeChunkSize: resumable ? $scope.chunkSize : null,
                    headers: {
                        'Access-Control-Allow-Origin': '*',
                        Authorization: apiInterceptor.tokenType + ' ' + apiInterceptor.apiToken
                    },
                    __RequestVerificationToken: $scope.token,
                    withCredentials: true
                }).then(function (resp) {
                    successCount++;
                    $scope.fileName = file.name;
                    if (successCount === 1) {
                        $scope.tempFileName = resp.data;
                        changeSheet(0);
                    }
                });
            }
        }
    }

    var resetMappingRow = function () {
        initColumns();
        $scope.selectedColumnMap = [];
    };

    var changeSheet = function (index) {
        $scope.showErrorTable = false;
        $scope.selectedSheet.sheetIndex = index;
        resetMappingRow();
        if (_.isString($scope.tempFileName)) {
            $scope.excelSource = { sheetNameList: [], dataList: [] };
            vatImportService.getFileContent($scope.tempFileName, $scope.selectedSheet.sheetIndex, $scope.selectedSheet.topRowNumber).success(function (data) {
                if (data && data.result === false) {
                    $scope.showInitTable = true;
                    $scope.showImportTable = false;
                    SweetAlert.warning(data.resultMsg);
                    return;
                }
                $scope.showInitTable = false;
                $scope.showImportTable = true
                $scope.excelSource = data;
                $scope.columnNum = data.dataList[0].length;
                $scope.firstDataRow = data.dataList[0];
                $scope.startRowList = _.range(data.lastRowIndex);
                $scope.selectedSheet.sheetName = $scope.excelSource.sheetNameList[$scope.selectedSheet.sheetIndex];
                citSessionService.dataChanged = true;
            }).error(function () {
                SweetAlert.error($translate.instant('PleaseContactAdministrator'));
            });
        }
    };

    var validateClientSide = function (dataList) {

        var periodIntCheckMsg = '';
        var periodCnt = 0;

        if (parseInt($scope.StartRowNum) > $scope.excelSource.dataList.length) {
            SweetAlert.warning($translate.instant('StartRowNumberCheckMsg'));
            return;
        }


        for (var i = $scope.StartRowNum - 1; i < $scope.excelSource.dataList.length; i++) {
            var period1 = $scope.excelSource.dataList[i][$.inArray($translate.instant('period'), $scope.selectedColumnMap)];
            if (isNaN(parseInt(period1))) {
                periodIntCheckMsg += $translate.instant('tranCode') + ':' +
                    $scope.excelSource.dataList[i][$.inArray($translate.instant('tranCode'), $scope.selectedColumnMap)] + ',' +
                    $translate.instant('period') + ':' + period1 + ',' +
                    $translate.instant('vGroup') + ':' +
                    $scope.excelSource.dataList[i][$.inArray($translate.instant('vGroup'), $scope.selectedColumnMap)] + ',' +
                    $translate.instant('vid') + ':' +
                    $scope.excelSource.dataList[i][$.inArray($translate.instant('vid'), $scope.selectedColumnMap)] + ',' +
                    $translate.instant('itemID') + ':' + itemID + ';<br />';
                periodCnt++;
            }
            else {
                if (period1 != period) continue;
        }

            if (periodCnt == 0) {
                var item = {
                    'TranCode': $scope.excelSource.dataList[i][$.inArray($translate.instant('tranCode'), $scope.selectedColumnMap)],
                    'Period': period1,
                    'Group': $scope.excelSource.dataList[i][$.inArray($translate.instant('vGroup'), $scope.selectedColumnMap)],
                    'VID': $scope.excelSource.dataList[i][$.inArray($translate.instant('vid'), $scope.selectedColumnMap)],
                    'ItemID': $scope.excelSource.dataList[i][$.inArray($translate.instant('itemID'), $scope.selectedColumnMap)]
            };
                dataList.push(item);
        }
        }

        $scope.errorMsgMap = [];

        if (periodCnt > 0) {
            $scope.errorMsgMap.push(
                {
                    'errorType': validationErrorType.PeriodParseErrorType,
                    'errorCount': periodCnt,
                    'errorContent': $translate.instant('PeriodParseErrorMsg').formatObj({ rows: periodIntCheckMsg })
            });
        };

        if ($scope.errorMsgMap.length > 0) {
            $('#errorListModal').modal('show');
            return false;
        }
        return true;
    };

    function doSave2Server(saveType) {
        // saveType 1:override,2:append
        if ($scope.excelSource.sheetNameList.length == 0) {
            SweetAlert.warning($translate.instant('PleaseSelectFileFirst'));
            return;
        }
        var notMappedColumns = '';
        if ($scope.selectedColumnMap.length >= 0) {
            var count1 = 0;
            $scope.necessoryColumns.forEach(function (m) {
                if (m !== $translate.instant('PleaseSelectColumn')) {
                    if ($.inArray(m, $scope.selectedColumnMap) < 0) {
                        notMappedColumns += m + ',';
                        count1++;
                    }
                }
            });
            if (notMappedColumns) {
                SweetAlert.warning($translate.instant('ColumnsMapErrorMsg').formatObj({ columns: notMappedColumns.substring(0, notMappedColumns.length - 1) }));
                return;
            }
        }
        var dataList = [];
        if (!validateClientSide(dataList)) return;
        if (dataList.length == 0) {
            SweetAlert.warning($translate.instant('noCurMonthRecordErrorMsg'));
            return;
        };

        $scope.errorMsgMap = [];
        if ($scope.errorMsgMap.length > 0) {
            $('#errorListModal').modal('show');
            return;
        }
        else {
            vatImportService.SaveVourcherMappings(dataList, period, saveType).success(function (data) {
                if (data) {
                    if (data.result) {
                        $scope.showInitTable = true;
                        $scope.showImportTable = false;
                        $scope.showErrorTable = false;
                        $scope.ImportErrorTab = false;
                        $scope.ImportErrorTag = false;
                        vatCommonService.importSetProjectStatus(projectDbName, period, constant.DictionaryDictKey.WFImportVoucherMap
                                                                , enums.FinishStatusEnum.Finished);
                        vatCommonService.setImportSubStatus(enums.VatImportSubStatus.isVoucherMapImport, true);
                        $log.debug("import voucherMapping save2Server: " + vatSessionService.project.importSubStatus.isVoucherMapImport);
                        SweetAlert.success($translate.instant('ImportSuccess'));
                        resetMappingRow();
                        getMappings();
                        $scope.fileName = '';
                    }
                    else {
                        processValidateMsg(data.data);
                    }
                }
            }).error(function () {
                SweetAlert.error($translate.instant('PleaseContactAdministrator'));
            });
        }
    }

    var save2Server = function (saveType) {
        if (vatSessionService.project.projectStatusList[$scope.period] >= constant.ProjectStatusEnum.Generated) {
            swal({
                title: "warning!",
                text: $translate.instant('IsConfirmToReImport').formatObj({ status: vatCommonService.getProjectStautsEnumDesc(vatSessionService.project.projectStatusList[$scope.period]) }),
                type: "warning",
                showCancelButton: true,
                confirmButtonColor: "#DD6B55",
                confirmButtonText: $translate.instant('Yes'),
                cancelButtonText: $translate.instant('No'),
                closeOnConfirm: true,
                closeOnCancel: true
            },
            function (isConfirm) {
                if (isConfirm) {
                    doSave2Server(saveType);
                }
                else {
                    swal.close();
                }
            });
        }
        else {
            doSave2Server(saveType);
        }
    };

    var buildDataStr = function (p) {
        var empty = '<' + $translate.instant('empty') + '>';
        return $translate.instant('tranCode') + ':' + (PWC.isNullOrEmpty(p.tranCode) ? empty : p.tranCode) + ',' +
            $translate.instant('period') + ':' + (PWC.isNullOrEmpty(p.period) ? empty : p.period) + ',' +
            $translate.instant('vid') + ':' + (PWC.isNullOrEmpty(p.vid) ? empty : p.vid) + ',' +
            $translate.instant('vGroup') + ':' + (PWC.isNullOrEmpty(p.group) ? empty : p.group) + ',' +
            $translate.instant('itemID') + ':' + (PWC.isNullOrEmpty(p.itemID) ? empty : p.itemID) + ';<br />';
    };

    var processValidateMsg = function (errorList) {
        if (errorList && errorList.length > 0) {
            errorList.forEach(function (v) {
                if (v.resultMsg === serverErrorType.DuplicateInFileErrorType) {
                    var vString = '';
                    v.data.forEach(function (p) {
                        vString += buildDataStr(p);
                    });
                    $scope.errorMsgMap.push(
                        {
                            'errorType': validationErrorType.DuplicateInFileErrorType,
                            'errorCount': v.data.length,
                            'errorContent': $translate.instant('DuplicateInFileErrorMsg').formatObj({ rows: vString })
                        });
                }
                else if (v.resultMsg === serverErrorType.DuplicateInDBErrorType) {
                    var vString = '';
                    v.data.forEach(function (p) {
                        vString += buildDataStr(p);
                    });
                    $scope.errorMsgMap.push(
                        {
                            'errorType': validationErrorType.DuplicateInDBErrorType,
                            'errorCount': v.data.length,
                            'errorContent': $translate.instant('DuplicateInDBErrorMsg').formatObj({ rows: vString })
                        });
                }
                else if (v.resultMsg === serverErrorType.EmptyFieldErrorType) {
                    var vString = '';
                    v.data.forEach(function (p) {
                        vString += buildDataStr(p);
                    });
                    $scope.errorMsgMap.push(
                        {
                            'errorType': validationErrorType.EmptyFieldErrorType,
                            'errorCount': v.data.length,
                            'errorContent': $translate.instant('EmptyFieldErrorMsg').formatObj({ rows: vString })
                        });
                }
                else if (v.resultMsg === serverErrorType.OverLengthFieldErrorType) {
                    var vString = '';
                    v.data.forEach(function (p) {
                        vString += buildDataStr(p);
                    });
                    $scope.errorMsgMap.push(
                        {
                            'errorType': validationErrorType.OverLengthFieldErrorType,
                            'errorCount': v.data.length,
                            'errorContent': $translate.instant('OverLengthErrorMsg').formatObj({ rows: vString })
                        });
                }

            });
        };
        if ($scope.errorMsgMap.length > 0) {
            $('#errorListModal').modal('show');
        }
    };

    var clear = function () {
        swal({
            title: "warning!",
            text: $translate.instant('ClearTips'),
            type: "warning",
            showCancelButton: true,
            confirmButtonColor: "#DD6B55",
            confirmButtonText: $translate.instant('Yes'),
            cancelButtonText: $translate.instant('No'),
            closeOnConfirm: true,
            closeOnCancel: true
        }, function (isConfirm) {
            if (isConfirm) {
                var dataList = [];
                var saveType = 1;//overide
                vatImportService.SaveVourcherMappings(dataList, period, saveType).success(function (data) {
                    if (data && data.result) {
                        $scope.showInitTable = true;
                        $scope.showImportTable = false;
                        $scope.showErrorTable = false;
                        $scope.ImportErrorTab = false;
                        $scope.ImportErrorTag = false;
                        vatCommonService.clearProjectStatus(projectDbName, period, constant.DictionaryDictKey.WFImportVoucherMap, enums.FinishStatusEnum.NotFinished);
                        vatCommonService.setImportSubStatus(enums.VatImportSubStatus.isVoucherMapImport, false);
                        $log.debug("clear voucherMapping clear: " + vatSessionService.project.importSubStatus.isVoucherMapImport);
                        SweetAlert.success($translate.instant('ClearSuccess'));
                        resetMappingRow();
                        getMappings();
                    }
                });
            }
        }).error(function () {
            SweetAlert.error($translate.instant('PleaseContactAdministrator'));
        });
    };

    var getMappings = function () {
        vatImportService.GetVourcherMappings(period).success(function (data) {
            if (data.length > 0) {
                GetValidationList(); 
            }
            else { 
                $scope.haveImported = false;
                $scope.showErrorTable = false;
                $scope.ImportErrorTab = false;
                $scope.ImportErrorTag = false;
            }

            $scope.excelSource = { sheetNameList: [], dataList: [] };
            $scope.mapppingList = data;
            var seqNo = 1;
            $scope.mapppingList.forEach(function (i) {
                i.index = seqNo;
                seqNo++;
            });
            $scope.gridOptions.data = $scope.mapppingList;
            $scope.gridOptions.noData = $scope.mapppingList.length === 0;
            $scope.firstDataRow = null;
            citSessionService.dataChanged = false;
        }).error(function () {
            SweetAlert.error($translate.instant('PleaseContactAdministrator'));
        });
    };

    $scope.$watch('selectedFileName', function (newValue, oldValue) {
        if (newValue && newValue !== oldValue) {
            UploadFile($scope.selectedFileName);
            $scope.ImportErrorTab = false;
            $scope.ImportErrorTag = false;
            resetMappingRow();
        }
    });

    //验证信息数据源
    $scope.gridOptionsErrorMsg = {
        rowHeight: constant.UIGrid.rowHeight,
        selectionRowHeaderWidth: constant.UIGrid.selectionRowHeaderWidth,
        enableSorting: false,
        enableColumnMenus: false,
        enableHorizontalScrollbar: uiGridConstants.scrollbars.enableHorizontalScrollbar,
        enableVerticalScrollbar: uiGridConstants.scrollbars.enableVerticalScrollbar,
        columnDefs: [
        {
            name: $translate.instant('Icon'), width: '5%', cellTemplate: '<div class="ui-grid-cell-contents"><span><img data-ng-src="{{grid.appScope.errorLevelToString(row.entity.errorLevel)}}"><span></div>'
        },
          {
              name: $translate.instant('SequenceNo'), width: '5%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.index}}<span></div>'
          },
          {
              name: $translate.instant('ErrorResult'), width: '20%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.validationResult}}<span></div>'
          },
           {
               name: $translate.instant('ErrorCount'), width: '10%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.number}}<span></div>'
           },
          {
              name: $translate.instant('ErrorDetail'), width: '35%', cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.validationDetails}}<span></div>'
          },
           {
               name: $translate.instant('ValidationTips'), width: '25%', cellTemplate: '<div class="ui-grid-cell-contents" title="{{row.entity.validationTips}}"><span>{{row.entity.validationTips}}<span></div>'
           },
        ],
        onRegisterApi: function (gridApi) {
            $scope.errorGridApi = gridApi;

        }
    };

    //获取验证信息
    function GetValidationList() {
        //改成海关清单类型
        $scope.validationType = 9;
        vatImportService.getValidationList($scope.validationType, $scope.period).success(function (data) {
            if (data.length > 0) {
                var index = 1;
                data.forEach(function (v) {
                    v.index = index++;
                });
                $scope.errorList = data;
                $scope.gridOptionsErrorMsg.data = data;

                showErrTab();
                $scope.toggleErrorTab();
                $scope.showErrorTable = true;
            }
            else {
                $scope.errorList = [];
                $scope.gridOptionsErrorMsg.data = [];
                $scope.showErrorTable = false;
                $scope.ImportErrorTab = false;
                $scope.ImportErrorTag = false;
            }
        });
    }

    //显示图标
    $scope.errorLevelToString = function (errorLevel) {
        if (errorLevel === 0) {
            return '/app-resources/images/vat/error.png';
        }
        if (errorLevel === 1) {
            return '/app-resources/images/vat/warning.png';
        }
        if (errorLevel === 2) {
            return '/app-resources/images/vat/tips.png';
        }
        else {
            return '/app-resources/images/vat/tips.png';
        }
    }

    //显示验证信息
    $scope.toggleErrorTab = function () {
        $scope.ImportErrorTag = !$scope.ImportErrorTag;

        // topIcon and content-resize gapBottom 15px
        if (!$scope.ImportErrorTag) {
            setErrorWrapCssDefault();
        } else {

            if (parseInt($('#content-resizer').css('bottom')) < 100) {
                $('#content-resizer').css('bottom', '190px');

                $('#topIcon').css({ bottom: '-381px' });

                $('.error-info-wrapper').css('height', '190px');
            }
        }
    };

    var setErrorWrapCssDefault = function () {
        $('#content-resizer').css('bottom', '65px');

        $('#topIcon').css({ bottom: '-501px' });

        $('.error-info-wrapper').css('height', '65px');
    };

    function showErrTab() {
        $scope.ImportErrorTab = true;
        $scope.ImportErrorTag = true;
        $scope.errorMsg = $translate.instant('ImportErrorMsg').formatObj({ "NumberOfError": $scope.errorList.length });

    };

    $scope.getGridHeight = function () {
        if ($scope.isLoadComplete) {
            return { height: ($('.balance-ouput-grid-wrapper').height()) + "px" };
        }
        else {
            return { height: 0 + "px" };
        }
    };

    $scope.getErrorGridHeight = function () {
        if ($scope.isLoadComplete) {
            var y = $("#error-info-wrapper").height();
            // Enough space
            if (y > constant.UIGrid.gapHeight) {
                y = y - constant.UIGrid.gapHeight;
                return { height: y + "px" };
            } else {

                return { height: '0px' };
            }
        }
        return {};
    };


    (function initialize() {
        $scope.StartRowNum = 2;
        $scope.mapppingList = [];
        $scope.mappingRow = null;
        $scope.firstDataRow = null;
        $scope.selectedColumnMap = [];
        $scope.selectedFileName = '';
        $scope.excelSource = { sheetNameList: [], dataList: [] };
        $scope.selectedSheet = { sheetName: '', sheetIndex: 0, topRowNumber: 0 };      
        $scope.refresh = getMappings;
        $scope.clear = clear;

        $scope.changeSheet = changeSheet;
        $scope.mappingColumn = mappingColumn;
        $scope.save2Server = save2Server;
        $scope.showInitTable = true;
        $scope.showImportTable = false;
        initColumns();
        initGrid();
        getMappings();


        $timeout(function () {
            $scope.isLoadComplete = true;
        }, 500);
    })();
}
]);