basicDataModule
    .controller('businessUnitController', ['$scope', '$log', 'SweetAlert', '$translate', 'businessUnitService', 'uiGridConstants', 'Upload', 'apiInterceptor', '$interval',
        function($scope, $log, SweetAlert, $translate, businessUnitService, uiGridConstants, Upload, apiInterceptor, $interval) {
            'use strict';

            // 模态框的编辑状态 true 编辑状态,false 创建状态
            $scope.isEdit = false;

            var formValidator = null;

            //当前编辑对象
            $scope.editingObject = { ID: "", Name: "", IsActive: true };

            var editModalSelector = ".business-unit #edit-modal";

            //显示指定消息编码对应的翻译文本信息
            var showError = function(messageCode) {
                var errMsg = $translate.instant(messageCode);
                SweetAlert.warning(errMsg);
            };

            //清空当前编辑字段值
            $scope.resetEditingObject = function() {
                $scope.editingObject = { ID: "", Name: "", IsActive: true };

                var elms = $(editModalSelector).find("form:first div[data-for]");
                elms.html("");
                elms.attr("class", "validate-success");
            }

            //创建(添加)新事业部,使用模态框实现编辑入口
            $scope.createNewData = function() {
                $scope.isEdit = false;

                $scope.resetEditingObject();

                $(editModalSelector).modal('show');
            };

            //编辑焦点行数据
            $scope.editFocusedRow = function(data) {
                $scope.isEdit = true;

                $scope.editingObject = { ID: data.ID, Name: data.name, IsActive: data.isActive };

                $(editModalSelector).modal('show');
            };

            //保存当前正在编辑数据行,经过界面初步校验后才会进入本功能
            $scope.saveEditRow = function() {
                if ($scope.editingObject == null) {
                    showError("BusinessUnitNoSelected");
                    return;
                }

                if (!($(editModalSelector).find("#edit-form").valid())) {
                    return;
                }

                var businessUnitArray = [];
                businessUnitArray.push($scope.editingObject);

                var successedFun = function() {
 
                    $scope.refreshData();
                     
                    $(editModalSelector).modal('hide');

                    if ($scope.isEdit) {
                        SweetAlert.success($translate.instant("OrganizationStructureEditSuccess"));
                    } else {
                        SweetAlert.success($translate.instant("OrganizationStructureAddSuccess"));
                    }
                };

                if ($scope.isEdit) {
                    businessUnitService.updateBusinessUnit(businessUnitArray).success(function (data) {
                        if (data.code===0) {
                            successedFun();
                        }else {
                            SweetAlert.error(data.message);
                        }
                    });

                } else {
                    businessUnitService.addBusinessUnit(businessUnitArray).success(function (data) {
                        if (data.code===0) {
                            successedFun();
                        }else {
                            SweetAlert.error(data.message);
                        }
                    });
                }
            };

            //取消保存当前编辑行
            $scope.cancelEditBusinessUnit = function() {
                $(editModalSelector).modal('hide');
            };

            //停用或启用当前事业部
            $scope.activeBusinessUnit = function(data) {
                data.isActive = !data.isActive;
                var businessUnitArray = [];
                businessUnitArray.push(data);

                businessUnitService.updateBusinessUnit(businessUnitArray).success(function(rst) {
                    $scope.refreshData();
                });
            };

            //获取事业部数据
            $scope.refreshData = function() {
                businessUnitService.getBusinessUnitList().success(function(data) {
                    $scope.gridOptions.data = data;
                });
            };

            $scope.getGridHeight = function() {
                return { height: $(".business-unit-containers .list-container").height() + "px" };
            }

            function intiUiGrid() {

                var opertionStr = '';
                if ($scope.hasEditPermission) {
                    opertionStr = '<div class="business-unit-gridcell-operation">' +
                        '<a ng-click="grid.appScope.editFocusedRow(row.entity)">' +
                        '    <i class="material-icons" style="margin-right: 10px;">&#xE254;</i>' +
                        '    <span>{{"OrganizationStructureEdit"|translate}}</span>' +
                        '</a>' +
                        '<a atms-permission permission-code="{{$root.adminPermission.basicData.businessUnit.editCode}}" ng-click="grid.appScope.activeBusinessUnit(row.entity)" ng-if="row.entity.isActive">' +
                        '    <i class="material-icons" style="color:#3f3f40">&#xE15C;</i>' +
                        '    <span>{{"BusinessUnitDisabledNode"|translate}}</span>' +
                        '</a>' +
                        '<a atms-permission permission-code="{{$root.adminPermission.basicData.businessUnit.editCode}}" ng-click="grid.appScope.activeBusinessUnit(row.entity)" ng-if="!row.entity.isActive">' +
                        '    <i class="material-icons" style="color:#e64400">&#xE038;</i>' +
                        '    <span>{{"BusinessUnitEnableNode"|translate}}</span>' +
                        '</a>' +
                        '</div>'
                } else {
                    opertionStr = '<div class="business-unit-gridcell-operation ' + constant.noPermissionClass + '">' +
                        '<a>' +
                        '    <i class="material-icons" style="margin-right: 10px;">&#xE254;</i>' +
                        '    <span>{{"OrganizationStructureEdit"|translate}}</span>' +
                        '</a>' +
                        '<a ng-if="row.entity.isActive">' +
                        '    <i class="material-icons" style="color:#3f3f40">&#xE15C;</i>' +
                        '    <span>{{"BusinessUnitDisabledNode"|translate}}</span>' +
                        '</a>' +
                        '<a  ng-if="!row.entity.isActive">' +
                        '    <i class="material-icons" style="color:#e64400">&#xE038;</i>' +
                        '    <span>{{"BusinessUnitEnableNode"|translate}}</span>' +
                        '</a>' +
                        '</div>'
                }

                $scope.gridOptions = {
                    rowHeight: constant.UIGrid.rowHeight,
                    selectionRowHeaderWidth: constant.UIGrid.selectionRowHeaderWidth,
                    enableSorting: true,
                    enableColumnMenus: false,
                    enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
                    enableRowSelection: true,
                    enableFullRowSelection: true,
                    enableRowHeaderSelection: false,
                    multiSelect: false,
                    columnDefs: [{
                        field: 'name',
                        name: $translate.instant('BusinessUnitName'),
                        width: '50%',
                        cellTemplate: '<div class="business-unit-gridcell-name" style="text-align: center"><span>{{row.entity.name}}</span><span ng-hide="true">{{row.entity.id}}</span></div>'
                    }, {
                        field: 'isActive',
                        name: $translate.instant('BusinessUnitStatus'),
                        width: '20%',
                        cellTemplate: '<div class="business-unit-gridcell-isactive">' +
                            '<span ng-if="row.entity.isActive">{{"BusinessUnitActive"|translate}}</span>' +
                            '<span ng-if="!row.entity.isActive">{{"BusinessUnitDisabled"|translate}}</span>' +
                            '</div>'
                    }, {
                        field: 'Operation',
                        name: $translate.instant('Operation'),
                        width: '30%',
                        cellTemplate: opertionStr
                    }],

                    onRegisterApi: function(gridApi) {
                        $scope.gridApi = gridApi;
                        $scope.gridApi.grid.registerRowsProcessor($scope.singleFilter, 200);
                        $interval(function() {
                            $scope.gridApi.core.handleWindowResize();
                        }, 500, 60 * 60 * 8);
                    }
                };

                $scope.singleFilter = function(renderableRows) {

                    var matcher = new RegExp($scope.searchEASText);
                    renderableRows.forEach(function(row) {

                        try {
                            var match = false;
                            ['code', 'name'].forEach(function(field) {
                                if (row.entity[field].match(matcher)) {
                                    match = true;
                                }
                            });
                            if (!match) {
                                row.visible = false;
                            }
                        } catch (e) {
                            $log.debug('singleFilter-match:' + JSON.stringify(row.entity));
                        }
                    });
                    return renderableRows;
                };
            }

            function intiValidate() {

                /*后台校验$.validator.addMethod("BURepeated", function(value, element, param) {
                    if ($scope.gridOptions.data && $scope.gridOptions.data.length > 0) {
                        var objects = $.grep($scope.gridOptions.data, function(n, i) {
                            return $scope.editingObject.ID != n.id && $.trim(n.name) == $.trim(value);
                        });

                        return objects.length < 1;
                    }

                    return true;

                });*/

                formValidator = $(editModalSelector).find("#edit-form").validate({
                    debug: true,

                    rules: {
                        Name: {
                            required: true,
                            minlength: 2,
                            maxlength: 50
                            // BURepeated: true
                        },
                        IsActive: {
                            required: "input[name='IsActive']:checked"
                        }
                    },
                    messages: {
                        Name: {
                            required: $translate.instant('BusinessUnitEmptyNode'),
                            minlength: $translate.instant('BusinessUnitEmptyNode'),
                            maxlength: $translate.instant('BusinessUnitOutOfLengthNode')
                            // BURepeated: $translate.instant('BusinessUnitDuplicateNode')
                        },
                        IsActive: $translate.instant('BusinessUnitStatusUnsureness')
                    },
                    errorPlacement: function(error, element) {
                        var elm = $(element).parents("form:first");
                        elm = elm.find("div[data-for='" + element.attr("name") + "']");
                        elm.html(error);
                        elm.attr("class", "validate-fail");
                    }
                });
            }

            var havePermission = function() {
                $scope.$root.checkUserPermission(constant.adminPermission.basicData.businessUnit.editCode).success(function(data) {
                    $scope.hasEditPermission = data;
                    intiUiGrid();
                    $scope.refreshData();
                    intiValidate();
                });
            };

            (function initialize() {
                $log.debug('businessUnitController.ctor()...');
                $scope.hasEditPermission = false;
                havePermission();

            })();
        }
    ]);