basicDataModule
.controller('StandardAccountManageController', ['$scope', '$log', 'SweetAlert', 'keywordmapService', 'uiGridConstants', 'stdAccountService', '$translate', 'orgService',
    function ($scope, $log, SweetAlert, keywordmapService, uiGridConstants, stdAccountService, $translate, orgService) {
        'use strict';

        var loadProjectIndustryList = function () {
            orgService.getProjectIndustrys().success(function (orgData) {
                $scope.projectIndustryList = orgData;
            });
        };

        var defaultSelectStandardAccount = {
            id: 0,
            name: '',
            fullName: '',
            code: '',
            parentCode: '',
            acctLevel: 0,
            selectValue: ' '
        };

        var loadstdAccountList = function () {
            stdAccountService.GetStdAccountList().success(function (data) {

                data.forEach(function (row) {
                    row.directionStr = $scope.directionMap[row.direction + ''];
                    row.acctPropStr = $scope.acctPropArray[row.acctProp];
                    row.selectValue = row.code + ' ' + row.fullName;
                });

                var list = data.concat();
                list = _.sortBy(list, 'code');

                if (list && list.length > 0) {
                    list.splice(0, 0, defaultSelectStandardAccount);
                } else {
                    list = [];
                    list.push(defaultSelectStandardAccount);
                }

                $scope.stdAccountList = list;
                $scope.gridOptions.data = data;
                $scope.gridOptions.noData = data.length === 0;
                $log.debug('keywordmapService.get...');
            });
        };

        var loadKeyWordMapList = function () {

            keywordmapService.get(1).success(function (data) {
                $scope.gridOptions.data = data;
                $scope.gridOptions.noData = data.length === 0;
                $log.debug('keywordmapService.get...');
            });
        };

        var load = function () {
            var selectedKeywordMapList = $scope.gridApi.selection.getSelectedRows();

            if (selectedKeywordMapList && selectedKeywordMapList.length > 0) {
                // 选中
                stdAccountService.get(selectedKeywordMapList[0].id).success(function (data) {
                    $scope.editModel = data;
                    $scope.isAdd = false;

                    $scope.selectStandardAccount = _.find($scope.stdAccountList, function (num) { return num.code === data.parentCode });

                    if (!$scope.selectStandardAccount) {
                        $scope.selectStandardAccount = defaultSelectStandardAccount;
                    }

                    $scope.selectDirection = _.find($scope.directionList, function (num) { return num.id === data.direction });
                    $scope.selectAcctProp = _.find($scope.acctPropList, function (num) { return num.id === data.acctProp });
                    $scope.selectProjectIndustry = _.find($scope.projectIndustryList, function (num) { return num.id === data.industryID });

                    $('#addStandardAccountPop').modal('show');
                });
            }
            else {
                $log.debug('please select one keywordMap...');
            }
        };

        var changesStdAccountSelect = function () {
            if ($scope.selectAccount) {
                $scope.editModel.name = $scope.selectAccount.name;
                $scope.editModel.stdFullName = $scope.selectAccount.fullName;
                $scope.editModel.stdCode = $scope.selectAccount.code;
            } else {
                $scope.editModel.name = '';
                $scope.editModel.stdFullName = '';
                $scope.editModel.stdCode = '';
            }
        };

        var save = function () {

            if (!($('#addStandardAccountForm').valid())) {
                return;
            }

            $scope.editModel.isActive = 1;
            $scope.editModel.ruleType = 2;
            if ($scope.selectStandardAccount && $scope.selectStandardAccount.code && $scope.selectStandardAccount.code.length > 0) {
                $scope.editModel.parentCode = $scope.selectStandardAccount.code;
                $scope.editModel.fullName = $scope.selectStandardAccount.fullName + '-' + $scope.editModel.name;
                $scope.editModel.acctLevel = $scope.selectStandardAccount.acctLevel + 1;
            } else {
                $scope.editModel.acctLevel = 1;
                $scope.editModel.fullName = $scope.editModel.name;
            }

            if ($scope.selectProjectIndustry && $scope.selectProjectIndustry.id) {
                $scope.editModel.industryID = $scope.selectProjectIndustry.id;
            }

            if ($scope.selectDirection && $scope.selectDirection.id) {
                $scope.editModel.direction = $scope.selectDirection.id;
            }

            if ($scope.selectAcctProp && $scope.selectAcctProp.id) {
                $scope.editModel.acctProp = $scope.selectAcctProp.id;
            }

            if ($scope.isAdd) {
                stdAccountService.add($scope.editModel).success(function (data) {
                    if (!data.result) {
                        var errorList = [];
                        var template = $translate.instant(data.resultMsg);
                        data.data.forEach(function (row) {
                            var error = template.formatObj({ code: row.code, name: row.name });
                            errorList.push(error);
                        });
                        showInfo('region', errorList.join(';', errorList), 'addStandardAccountPop');
                        //SweetAlert.info("region", errorList.join(';', errorList));
                        //$log.debug("add error",  errorList.join(';', errorList));
                        return;
                    }
                    $('#addStandardAccountPop').modal('hide');
                    loadstdAccountList();
                });
            } else {
                stdAccountService.update($scope.editModel).success(function (data) {
                    if (!data.result) {
                        var errorList = [];
                        var template = $translate.instant(data.resultMsg);
                        data.data.forEach(function (row) {
                            var error = template.formatObj({ code: row.code, name: row.name });
                            errorList.push(error);
                        });

                        //SweetAlert.info("region", errorList.join(';', errorList));
                        showInfo('region', errorList.join(';', errorList), 'addStandardAccountPop');
                        return;
                    }
                    $('#addStandardAccountPop').modal('hide');
                    loadstdAccountList();
                });
            }
        };

        var search = function () {
            $scope.gridApi.grid.refresh();
        };

        // 新增
        var newModel = function () {
            $scope.editModel = {};
            $scope.isAdd = true;
            $scope.selectStandardAccount = defaultSelectStandardAccount;
            $scope.selectDirection = null;
            $scope.selectAcctProp = null;
            resetErrorStatus();
            $('#addStandardAccountPop').modal('show');
        };

        var resetErrorStatus = function () {
            var currentForm = $('#addStandardAccountForm');
            $.each(currentForm.children(), function (index, element) {

                // 去除div
                $(element).children('div').removeClass('has-error');
            });
            validator.resetForm();
        };

        var resources = {
            codeRequired: $translate.instant('StandardAccountCodeRequired'),
            nameRequired: $translate.instant('StandardAccountNameRequired'),
            selectDirectionRequired: $translate.instant('StandardAccountRequired'),
            selectAcctPropRequired: $translate.instant('StandardAccountAccountTypesRequired')
        };


        var validator = $("#addStandardAccountForm").validate({
            errorClass: "has-error",
            rules: {
                code: {
                    required: true
                },
                name: {
                    required: true
                },
                selectDirection: {
                    required: true
                },
                selectAcctProp: {
                    required: true
                }
            },
            messages: {
                code: {
                    required: resources.codeRequired
                },
                name: {
                    required: resources.nameRequired
                },
                selectDirection: {
                    required: resources.selectDirectionRequired
                },
                selectAcctProp: {
                    required: resources.selectAcctPropRequired
                }
            },
            errorPlacement: function (error, element) {
                setErrorStyle(error, element);
            }
        });

        var setErrorStyle = function (error, element) {
            if (element.hasClass('has-error')) {
                element.parent().addClass('has-error');
                error.insertAfter(element);
                error.addClass('label');
                // error.addClass('label-danger');
            }
        };

        var modifyIsActive = function () {
            var selectedKeywordMapList = $scope.gridApi.selection.getSelectedRows();

            if (selectedKeywordMapList && selectedKeywordMapList.length > 0) {

                SweetAlert.swal({
                    title: $translate.instant('ComfirmDisable') + '?',
                    text: $translate.instant('ComfirmStandardAccountDisable').formatObj({ code: selectedKeywordMapList[0].code, fullName: selectedKeywordMapList[0].fullName }),
                    type: "warning",
                    showCancelButton: true,
                    confirmButtonColor: "#DD6B55", confirmButtonText: $translate.instant('Confirm'),
                    cancelButtonText: $translate.instant('Cancel'),
                    closeOnConfirm: false,
                    closeOnCancel: true
                },
                function (isConfirm) {
                    if (isConfirm) {
                        // 选中
                        var model = selectedKeywordMapList[0];
                        model.isActive = !model.isActive;
                        stdAccountService.isactive(model).success(function (data) {

                            SweetAlert.info('info', 'log success');
                            if (!data.result) {
                                SweetAlert.info('info', $translate.instant(data.resultMsg));

                            } else {
                                SweetAlert.swal($translate.instant('ComfirmDisable') + '!', $translate.instant("ComfirmDisableSuccess"), "success");
                                loadstdAccountList();
                            }
                        });
                    }
                });
            }
            else {
                $log.debug('please select one keywordMap...');
            }
        };


        var showInfo = function (title, msg, id) {
            if (id) {
                $('#' + id).modal('hide');
            }
            SweetAlert.swal({
                title: title,
                text: msg,
                type: "info",
                showCancelButton: false,
                confirmButtonClass: "btn-info",
                confirmButtonText: $translate.instant('Confirm'),
                closeOnConfirm: true
            },
            function () {
                if (id) {
                    $('#' + id).modal('show');
                }
            });
        };

        (function initialize() {
            $log.debug('StandardAccountManageControllerController.ctor()...');
            $scope.stdAccountList = [];
            $scope.search = search;
            $scope.newModel = newModel;
            $scope.changesStdAccountSelect = changesStdAccountSelect;
            $scope.save = save;
            $scope.load = load;
            $scope.modifyIsActive = modifyIsActive;
            $scope.acctPropArray = ['', $translate.instant('StandardAccountAcctPropAsset'),
                $translate.instant('StandardAccountAcctPropDebt'),
                 $translate.instant('StandardAccountAcctPropCommon'),
                 $translate.instant('StandardAccountAcctPropInterest'),
                 $translate.instant('StandardAccountAcctPropCost'),
                 $translate.instant('StandardAccountAcctPropProfitAndLoss')];
            $scope.directionMap = { '1': $translate.instant('StandardAccountDebit'), '-1': $translate.instant('StandardAccountCredit') };

            $scope.selectStandardAccount = defaultSelectStandardAccount;
            $scope.selectDirection = null;
            $scope.selectAcctProp = null;

            $scope.directionList = [
                { id: 1, name: $translate.instant('StandardAccountDebit') },
                { id: -1, name: $translate.instant('StandardAccountCredit') },
            ];

            $scope.acctPropList = [
                 { id: 1, name: $translate.instant('StandardAccountAcctPropAsset') },
                 { id: 2, name: $translate.instant('StandardAccountAcctPropDebt') },
                 { id: 3, name: $translate.instant('StandardAccountAcctPropCommon') },
                 { id: 4, name: $translate.instant('StandardAccountAcctPropInterest') },
                 { id: 5, name: $translate.instant('StandardAccountAcctPropCost') },
                 { id: 6, name: $translate.instant('StandardAccountAcctPropProfitAndLoss') },
            ];

            loadProjectIndustryList();
            loadstdAccountList();
            //loadKeyWordMapList();

            $scope.gridOptions = {
                rowHeight: 45,
                selectionRowHeaderWidth: 45,
                enableFullRowSelection: true,
                enableRowSelection: true,
                enableSorting: false,
                enableFiltering: false,
                enableColumnMenus: false,
                enableRowHeaderSelection: false,
                multiSelect: false,
                enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
                columnDefs: [
                  {
                      field: 'code', name: $translate.instant('StandardAccountCode'), width: '20%', headerCellClass: 'header-cell-class',
                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.code}}</span></div>'
                  },
                  {
                      field: 'name', name: $translate.instant('StandardAccountName'), width: '30%', headerCellClass: 'header-cell-class',
                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.name}}</span></div>'
                  },
                  {
                      field: 'parentName', name: $translate.instant('StandardAccountSuperiorAccount'), width: '30%', headerCellClass: 'header-cell-class',
                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.parentName}}</span></div>'
                  },
                  {
                      field: 'directionStr', name: $translate.instant('StandardAccountDirection'), width: '10%', headerCellClass: 'header-cell-class',
                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.directionStr}}</span></div>'
                  },
                  {
                      field: 'acctPropStr', name: $translate.instant('StandardAccountAccountTypes'), width: '10%', headerCellClass: 'header-cell-class',
                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.acctPropStr}}</span></div>'
                  }
                ],
                onRegisterApi: function (gridApi) {
                    $scope.gridApi = gridApi;
                    $scope.gridApi.grid.registerRowsProcessor($scope.singleFilter, 200);
                }
            };

            $scope.singleFilter = function (renderableRows) {
                var matcher = new RegExp($scope.searchText);
                renderableRows.forEach(function (row) {
                    var match = false;
                    ['code', 'name', 'parentName', 'directionStr', 'acctPropStr'].forEach(function (field) {
                        if (row.entity[field].match(matcher)) {
                            match = true;
                        }
                    });
                    if (!match) {
                        row.visible = false;
                    }
                });
                return renderableRows;
            };

        })();

    }
]);