infrastructureModule
.controller('UserManageController', ['$scope', '$log', 'userService', 'orgService', 'uiGridConstants', 'SweetAlert', 'projectService', 'roleService', '$translate', 'enums',
    function ($scope, $log, userService, orgService, uiGridConstants, SweetAlert, projectService, roleService, $translate, enums) {
        'use strict';

        /***********************************************************new code start*********************************************************/

        //Clear user model
        var newUser = function () {
            $scope.isAdd = true;
            $scope.editUserModel = {};
            resetErrorStatus();
            $('#addUserPop').modal('show');
        };


        //Initial user list
        var initUser = function () {
            userService.getUserTreeList().success(function (userData) {
                $scope.userList = userData;
                selectedUser($scope.userList[0].subUsers[0]);
                getProjectByUserId($scope.userList[0].subUsers[0].id);
            });
        };


        //select tree node event
        var selectedUser = function (user) {

            if (user.id === constant.guid.empty) {
                return;
            }

            $scope.selectUser = user;

            $scope.selectUser.statusName = $scope.selectUser.status === enums.userStatus.disabled ? $translate.instant('UserStateDisable') :
                ($scope.selectUser.status === enums.userStatus.active ? $translate.instant('UserStateEnable') :
                ($scope.selectUser.status === enums.userStatus.inActive ? $translate.instant('UserStateUnActive') :
                ($scope.selectUser.status === enums.userStatus.locked ? $translate.instant('UserStateLocked') : $translate.instant('UserStateUnknow'))));

            if ($scope.selectUser.organizationID) {
                orgService.getSingleOrg($scope.selectUser.organizationID).success(function (orgData) {
                    $scope.selectUser.OrgName = orgData.name;
                });
            }
            else {
                $scope.selectUser.OrgName = '';
            }

            getProjectByUserId($scope.selectUser.id);
        };

        //Load user info by userId
        var loadUser = function (userId) {
            $scope.isAdd = false;
            resetErrorStatus();
            userService.getSingleUser(userId).success(function (userData) {
                $scope.editUserModel.IsAdmin = userData.isAdmin;
                $scope.editUserModel.ID = userData.ID;
                $scope.editUserModel.UserName = userData.userName;
                $scope.editUserModel.Status = userData.status;
                $scope.editUserModel.OrganizationID = userData.organizationID;
                $scope.editUserModel.Email = userData.email;
                $scope.editUserModel.OrgName = userData.orgName;
                $scope.editUserModel.RoleIDs = userData.roleIDs;
                $scope.editUserModel.RoleNames = userData.roleNames;
                $scope.editUserModel.CreateTime = userData.createTime;
                $scope.editUserModel.Password = userData.password;
            });
            $('#addUserPop').modal('show');
        };


        //Save role info
        var saveUser = function () {
            if (!($('#userForm').valid())) {
                return;
            }

            if ($scope.isAdd) {

                userService.addUser($scope.editUserModel).success(function (or) {
                    if (or) {
                        if (or.result === true) {
                            SweetAlert.success($translate.instant('AddUserSuccess'));
                            $scope.editUserModel = {};
                            initUser();
                        }
                        else {
                            SweetAlert.warning($translate.instant(or.resultMsg));
                        }
                    }
                });
            } else {

                userService.updateUser($scope.editUserModel).success(function (or) {
                    if (or) {
                        if (or.result === true) {
                            SweetAlert.success($translate.instant('UpdateUserSuccess'));
                            $scope.editUserModel = {};
                            initUser();
                        }
                        else {
                            SweetAlert.warning($translate.instant(or.resultMsg));
                        }
                    }
                });
            }
            $('#addUserPop').modal('hide');

        };

        //disable user account
        var disableUser = function (user) {
            SweetAlert.swal({
                title: $translate.instant('Confirm') + $translate.instant('StopUse') + '?',
                text: $translate.instant('Confirm') + $translate.instant('StopUse') + user.userName,
                type: "warning",
                showCancelButton: true,
                confirmButtonColor: "#DD6B55", confirmButtonText: $translate.instant('Confirm'),
                cancelButtonText: $translate.instant('Cancel'),
                closeOnConfirm: false,
                closeOnCancel: true
            },
          function (isConfirm) {
              if (isConfirm) {
                  // 选中
                  userService.enableOrDisableUser(user.id, 0).success(function (or) {
                      if (or) {
                          if (or.result === true) {
                              $scope.selectUser.status = enums.userStatus.disabled;
                              $scope.selectUser.statusName = $translate.instant('StopUse');
                              SweetAlert.success($translate.instant('DisableUserSuccess'));
                          }
                          else {
                              SweetAlert.warning($translate.instant(or.resultMsg));
                          }
                      }
                  });
              }
          });

        };

        //enable user account
        var enableUser = function (userId) {
            userService.enableOrDisableUser(userId, enums.userStatus.active).success(function (or) {
                if (or) {
                    if (or.result === true) {
                        $scope.selectUser.status = enums.userStatus.active;
                        $scope.selectUser.statusName = $translate.instant('Enable');
                        SweetAlert.success($translate.instant('EnableUserSuccess'));
                    }
                    else {
                        SweetAlert.warning($translate.instant(or.resultMsg));
                    }
                }
            })
        };

        //get project list by userid
        var getProjectByUserId = function (userId) {
            userService.getProjectListByUserId(userId).success(function (projectData) {
                var curProject = null;
                projectData.forEach(function (p) {
                    if (!curProject) {
                        curProject = p;
                        p.nameDisplay = p.name;
                        p.organizationNameDisplay = p.organizationName;
                        p.yearDisplay = p.year;
                    }
                    else {
                        if (p.id == curProject.id) {
                            p.nameDisplay = '';
                            p.organizationNameDisplay = '';
                            p.yearDisplay = '';
                        }
                        else {
                            curProject = p;
                            p.nameDisplay = p.name;
                            p.organizationNameDisplay = p.organizationName;
                            p.yearDisplay = p.year;
                        }
                    }
                });
                $scope.gridOptionsProjectList.data = projectData;
            });
        };


        //add project pop up 
        var addProjectPopUp = function () {
            if (!$scope.selectUser) {
                SweetAlert.warning($translate.instant('SelectUserFirst'));
                return;
            }

            if ($scope.selectUser.status === 0) {
                SweetAlert.warning($translate.instant('DisabledUser'));
                return;
            }

            projectService.getProjectExceptSelected($scope.selectUser.id).success(function (allProjectData) {
                //set index number, ui-grid have no $$index
                var projectIndex = 1;
                var curProject = null;
                allProjectData.forEach(function (p) {
                    if (!curProject) {
                        curProject = p;
                        p.index = projectIndex++;
                        p.nameDisplay = p.name;
                        p.organizationNameDisplay = p.organizationName;
                        p.yearDisplay = p.year;
                        p.industryNameDisplay = p.industryName;
                    }
                    else {
                        if (p.id == curProject.id) {
                            p.nameDisplay = '';
                            p.organizationNameDisplay = '';
                            p.yearDisplay = '';
                            p.industryNameDisplay = '';
                        }
                        else {
                            curProject = p;
                            p.index = projectIndex++;
                            p.nameDisplay = p.name;
                            p.organizationNameDisplay = p.organizationName;
                            p.yearDisplay = p.year;
                            p.industryNameDisplay = p.industryName;
                        }
                    }
                });
                $scope.gridOptionsAllProjectList.data = allProjectData;
            });

            $scope.gridApiAllProject.selection.clearSelectedRows();
            $('#addProjectPop').modal('show');
        };

        //add project to user
        var addProject = function () {
            var selectedProject = $scope.gridApiAllProject.selection.getSelectedRows();
            if (selectedProject && selectedProject.length === 0) {
                showInfo($translate.instant('AssignProject'), $translate.instant('SelectOneProjectToAdd'), 'addProjectPop');
                return;
            }
            var selectedProjectIds = [];
            if (selectedProject) {
                selectedProject.forEach(function (s) {
                    selectedProjectIds.push({ 'projectID': s.id, 'serviceTypeID': s.serviceTypeID });
                });
            }
            var userProject = {};
            userProject.UserId = $scope.selectUser.id;
            userProject.ProjectIds = selectedProjectIds;

            userService.addProjectToUser(userProject).success(function (or) {
                if (or) {
                    if (or.result === true) {
                        SweetAlert.success($translate.instant('AddProjectToUserSuccess'));
                        getProjectByUserId($scope.selectUser.id);
                        $('#addProjectPop').modal('hide');
                    }
                    else {
                        SweetAlert.warning($translate.instant(or.resultMsg));
                    }
                }

            });
        };

        //remove project from user
        var removeProject = function () {
            var selectedProject = $scope.gridApiProject.selection.getSelectedRows();
            if (selectedProject && selectedProject.length === 0) {
                SweetAlert.warning($translate.instant('SelectOneProjectToDelete'));
                return;
            }
            var selectedProjectIds = [];
            if (selectedProject) {
                selectedProject.forEach(function (s) {
                    selectedProjectIds.push({ 'projectID': s.id, 'serviceTypeID': s.serviceTypeID });
                });
            }
            var userProject = {};
            userProject.UserId = $scope.selectUser.id;
            userProject.ProjectIds = selectedProjectIds;

            userService.removeProjectFromUser(userProject).success(function (or) {
                if (or) {
                    if (or.result === true) {
                        SweetAlert.success($translate.instant('RemoveProjectFromUserSuccess'));
                        getProjectByUserId($scope.selectUser.id);
                        $scope.gridApiProject.selection.clearSelectedRows();
                    }
                    else {
                        SweetAlert.warning($translate.instant(or.resultMsg));
                    }
                }
            });
        };


        //assign role to project
        var assignRole = function (event, project) {
            if ($('.assign-user-box').is(":hidden")) {
                $('.assign-user-box').css('top', event.clientY + document.body.scrollTop);
                $('.assign-user-box').css('left', event.clientX - 110);
                $(".assign-user-box").show();
            } else {
                $(".assign-user-box").hide();
            }

            $(document).one("click", function () {
                $(".assign-user-box").hide();
            });
            event.stopPropagation();
            $scope.roleList = [];
            getRoleByService(project);

            //set currentProject 
            $scope.curProject = project;

        };

        //get role by serviceType
        var getRoleByService = function (project) {

            var selectedProjectIds = [];
            selectedProjectIds.push({ 'projectID': project.id, 'serviceTypeID': project.serviceTypeID });

            var userProject = {};
            userProject.UserId = $scope.selectUser.id;
            userProject.ProjectIds = selectedProjectIds;

            roleService.getRoleListByRoleTypeId(project.serviceTypeID).success(function (roleData) {

                //get project's own roles
                userService.getProjectRoles(userProject).success(function (checkedRole) {
                    $scope.roleChecked = checkedRole;

                    //checked own roles
                    roleData.forEach(function (r) {
                        if ($.inArray(r.id, $scope.roleChecked) > -1) {
                            r.isChecked = true;
                        }
                    });
                    $scope.roleList = roleData;
                });

            });
        };

        //add or remove role to project
        var setRoleToProject = function (role) {
            $log.debug(role.isChecked);
            $log.debug(role.id);

            var selectedProjectIds = [];
            selectedProjectIds.push({ 'projectID': $scope.curProject.id, 'serviceTypeID': $scope.curProject.serviceTypeID });

            var userProject = {};
            userProject.UserId = $scope.selectUser.id;
            userProject.ProjectIds = selectedProjectIds;
            userProject.RoleID = role.id;

            if (role.isChecked) {
                userProject.IsAdd = true;
                userService.operateProjectRole(userProject).success(function (or) {
                });
            }
            else {
                userProject.IsAdd = false;
                userService.operateProjectRole(userProject).success(function (or) {
                });
            }
        };

        var resources = {
            userNameRequired: $translate.instant('RequireUserName'),
            userEmailRequired: $translate.instant('RequireEmail'),
            userEmailCheck: $translate.instant('RequireCorrectEmail'),
            userOrgRequired: $translate.instant('RequireOrganization')
        };

        var validator = $('#userForm').validate({
            errorClass: "has-error",
            rules: {
                inputUserName: {
                    required: true
                },
                inputUserEmail: {
                    required: true,
                    email: true
                },
                orgName: {
                    required: true
                }
            },
            messages: {
                inputUserName: {
                    required: resources.userNameRequired
                },
                inputUserEmail: {
                    required: resources.userEmailRequired,
                    email: resources.userEmailCheck
                },
                orgName: {
                    required: resources.userOrgRequired
                }
            },
            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');
            }
            if (element[0].name === 'orgName') {
                element.parent().addClass('col-xs-9');
                element.parent().addClass('padding-left-zero');
            }
        };

        var resetErrorStatus = function () {
            validator.resetForm();
            var currentForm = $('#userForm');
            $(currentForm).find('.has-error').removeClass('has-error');
        };

        var showOperateLogPop = function () {
            $scope.isShowLog = true;
            // $('#showOperatePop').modal('show');
        };
        
        $scope.getGridHeight = function () {
            return { height: ($(".user-manage .project-list-container").height() - $(".user-manage .project-list-container .buttons").height()) + "px" };
        };

        //init page
        (function initialize() {
            $log.debug('UserManageController.ctor()...');
            $scope.userList = [];
            $scope.isAdd = false;
            //To save new role model or edit role model
            $scope.editUserModel = {};

            /*************************new variables****************************/
            $scope.selectUser = {};
            $scope.searchText = '';
            $scope.roleList = [];
            $scope.roleChecked = [];


            $(".assign-user-box").on("click", function (e) {
                e.stopPropagation();
            });

            $scope.gridOptionsProjectList = {
                rowHeight: 55,
                selectionRowHeaderWidth: 55,
                enableSorting: false,
                enableColumnMenus: false,
                enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
                enableRowSelection: true,
                enableSelectAll: true,
                columnDefs: [
                  {
                      field: 'name', name: $translate.instant('ProjectNameCol'), width: '29.5%', headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.nameDisplay}}<span></div>'
                  },
                  {
                      field: 'organizationName', name: $translate.instant('ProjectCompanyCol'), width: '23.5%', headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.organizationNameDisplay}}</span></div>'
                  },
                  {
                      field: 'year', name: $translate.instant('ProjectYearCol'), width: '11.8%', headerCellClass: 'cell-text-align-center',
                      cellTemplate: '<div class="cell-text-align-center"><span>{{row.entity.yearDisplay}}</span></div>'
                  },
                  {
                      field: 'serviceTypeName', name: $translate.instant('ProjectServiceCol'), width: '17.6%', headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.serviceTypeName}}</span></div>'
                  },
                  {
                      name: $translate.instant('AssignRoleCol'), width: '17.6%', headerCellClass: 'cell-text-align-center', enableFiltering: false,
                      cellTemplate: '<div class="cell-text-align-center">' +
                          '<a class="assignA" href="javascript:void(0)" ng-click="grid.appScope.assignRole($event,row.entity)"> <i class="material-icons">rate_review</i></a>' +
                          '</div>'
                  }
                ],
                onRegisterApi: function (gridApi) {
                    $scope.gridApiProject = gridApi;
                }
            };

            $scope.gridOptionsAllProjectList = {
                rowHeight: 55,
                selectionRowHeaderWidth: 55,
                enableSorting: false,
                enableColumnMenus: false,
                enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
                enableRowSelection: true,
                enableSelectAll: true,
                columnDefs: [
                   {
                       field: 'index', name: $translate.instant('SequenceNoCol'), width: 90, headerCellClass: 'cell-text-align-center', enableFiltering: false,
                       cellTemplate: '<div class="cell-text-align-center"><span>{{row.entity.index}}<span></div>'
                   },
                  {
                      field: 'name', name: $translate.instant('ProjectNameCol'), width: 250, headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.nameDisplay}}<span></div>'
                  },
                  {
                      field: 'organizationName', name: $translate.instant('ProjectCompanyCol'), width: 200, headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.organizationNameDisplay}}</span></div>'
                  },
                  {
                      field: 'year', name: $translate.instant('ProjectYearCol'), width: 100, headerCellClass: 'cell-text-align-center',
                      cellTemplate: '<div class="cell-text-align-center"><span>{{row.entity.yearDisplay}}</span></div>'
                  },
                  {
                      field: 'serviceTypeName', name: $translate.instant('ProjectServiceCol'), width: 220, headerCellClass: 'cell-text-align-left',
                      cellTemplate: '<div><span>{{row.entity.serviceTypeName}}</span></div>'
                  }
                ],
                onRegisterApi: function (gridApi) {
                    $scope.gridApiAllProject = gridApi;
                }
            };


            initUser();

            //Save user info
            $scope.saveUser = saveUser;

            //Load user info by userId
            $scope.loadUser = loadUser;

            //Clear user model
            $scope.newUser = newUser;

            //Enable user 
            $scope.enableUser = enableUser;

            //Disable user
            $scope.disableUser = disableUser;

            //Select user
            $scope.selectedUser = selectedUser;

            //Assign role
            $scope.assignRole = assignRole;

            //Add project pop up
            $scope.addProjectPopUp = addProjectPopUp;

            //Add project
            $scope.addProject = addProject;

            //Remove project
            $scope.removeProject = removeProject;

            //Set role to project
            $scope.setRoleToProject = setRoleToProject;

            $scope.resetErrorStatus = resetErrorStatus;

            $scope.showOperateLogPop = showOperateLogPop;

        })();
    }
]);